gpt4 book ai didi

php - 如何在ElasticSearch中的某些索引中搜索

转载 作者:行者123 更新时间:2023-12-03 02:02:46 25 4
gpt4 key购买 nike

我使用的是Elastica PHP库。
首先,在使用搜索之前,我需要负载索引:

// Load index
$elasticaIndex = $elasticaClient->getIndex('twit');

然后我可以查询:
$elasticaResultSet = $elasticaIndex->search($elasticaQuery);

如何建立对某些索引的搜索,而不仅仅是 twit

我用下一个:
public function Query($value, $elasticaIndex)
{
$elasticaQueryString = new \Elastica\Query\QueryString();
$elasticaQueryString->setQuery((string)$value);

// Create the actual search object with some data.
$elasticaQuery = new \Elastica\Query();
$elasticaQuery->setQuery($elasticaQueryString);

//Search on the index.
$elasticaResultSet = $elasticaIndex->search($elasticaQuery);
return $elasticaResultSet->getResults();
}

添加文档:
private function addDocument($data, $index)
{
$this->elasticaIndex = $this->elastic->getIndex($name);
$this->elasticaIndex->create(array(), true);

foreach ($data as $id => $val) {
$documents[] = new \Elastica\Document(
$id, $val
);
}

$this->elasticaType->addDocuments($documents);
$this->elasticaType->getIndex()->refresh();
}

这是正确的代码吗?

创建索引和映射:

为了创建一些索引,我使用函数wuth param $name,它表示索引名称:
private function createIndex($name)
{
$this->elasticaIndex = $this->elastic->getIndex($name);
$this->elasticaIndex->create(array(
'number_of_shards' => 4,
'number_of_replicas' => 1,
'analysis' => array(
'analyzer' => array(
$name.'Analyzer' => array(
'type' => 'custom',
'tokenizer' => 'standard',
'filter' => array('lowercase', 'mySnowball')
),
$name.'Analyzer' => array(
'type' => 'custom',
'tokenizer' => 'standard',
'filter' => array('standard', 'lowercase', 'mySnowball')
)
)
/*'filter' => array(
'mySnowball' => array(
'type' => 'snowball',
'language' => 'German'
)
)*/
)
), true);

$this->elasticaType = $this->elasticaIndex->getType($name);
}

请注意 'analyzer' => array()方法中对 create()的注意。它需要进行映射。

我也有构造函数,它创建映射。对于此构造函数,我传递的 $elasticaType是上面创建的索引中的 index_analyzersearch_analyzer的名称。
 function __construct($elasticaType)
{
parent::__construct();
$elasticaIndex = $this->elastic->getIndex($elasticaType);
$elasticaType = $elasticaIndex->getType($elasticaType);

$this->mapping = new \Elastica\Type\Mapping();
$this->mapping->setType($elasticaType);
$this->mapping->setParam('index_analyzer', $elasticaType.'Analyzer');
$this->mapping->setParam('search_analyzer', $elasticaType.'Analyzer');
}

当我尝试创建映射时,出现错误:
Fatal error: Uncaught exception 'Elastica\Exception\ResponseException' with message 'MapperParsingException[Analyzer [Analyzer] not found for index_analyzer setting on root type [users]]' in 

最佳答案

您可以使用\Elastica\Search类搜索多个索引。这是您的代码的更新版本:

public function Query($value, $elasticaClient)
{
$elasticaQueryString = new \Elastica\Query\QueryString();
$elasticaQueryString->setQuery((string)$value);

// Create the actual search object with some data.
$elasticaQuery = new \Elastica\Query();
$elasticaQuery->setQuery($elasticaQueryString);

//Search
$search = new \Elastica\Search($elasticaClient);
$search->addIndex('twit');
$search->addIndex('an_other_index');
$elasticaResultSet = $search->search($elasticaQuery);

return $elasticaResultSet->getResults();
}

由于您要搜索多个索引,因此不需要传递 $elasticaIndex变量,而需要传递 $elasticaClient

如果您出于某种技术原因而想要保留 $elasticaIndex方式,则可以通过以下方式实现您想要的方式:
public function Query($value, $elasticaIndex)
{
$elasticaQueryString = new \Elastica\Query\QueryString();
$elasticaQueryString->setQuery((string)$value);

// Create the actual search object with some data.
$elasticaQuery = new \Elastica\Query();
$elasticaQuery->setQuery($elasticaQueryString);

//Search
$search = $elasticaIndex->createSearch();
$search->addIndex('an_other_index');
$elasticaResultSet = $search->search($elasticaQuery);

return $elasticaResultSet->getResults();
}

对于分析器的最后一个问题,您可以在执行时覆盖var $elasticaType:
$elasticaType = $elasticaIndex->getType($elasticaType);

您应该改为执行以下操作:
 function __construct($name)
{
parent::__construct();
$elasticaIndex = $this->elastic->getIndex($name);
$elasticaType = $elasticaIndex->getType($name);

$this->mapping = new \Elastica\Type\Mapping();
$this->mapping->setType($elasticaType);
$this->mapping->setParam('index_analyzer', $name.'Analyzer');
$this->mapping->setParam('search_analyzer', $name.'Analyzer');
}

关于php - 如何在ElasticSearch中的某些索引中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30369491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com