Я использую библиотеку эластика 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
Вы можете искать в нескольких индексах с \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');
}
Других решений пока нет …