Как выполнить поиск по некоторым индексам в ElasticSearch

Я использую библиотеку эластика 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();
}

Это правильный код?

Создание индексов и отображение:

Для создания некоторых индексов я использую функцию с параметром $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_analyzer, search_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

0

Решение

Вы можете искать в нескольких индексах с \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();
}

Для вашего последнего вопроса с анализаторами вы переопределяете переменную $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');
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]