#php #search #elasticsearch #highlighting #foselasticabundle
#php #Поиск #elasticsearch #выделение #foselasticabundle
Вопрос:
Я пытаюсь вернуть основные моменты при поиске по глобальному индексу с помощью пакета FOSElastica.
В моей конфигурации есть поиск по глобальному индексу (файл yml):
fos_elastica:
clients:
default: { host: %elastic_host%, port: %elastic_port% }
indexes:
myIndex:
client: default
finder: ~
types:
# different types here
и я использую его в соответствии с документом (здесь) :
$finder = $this->container->get('fos_elastica.finder.myIndex');
// Returns a mixed array of any objects mapped
$results = $finder->find('whatever');
Это работает отлично и возвращает ожидаемые результаты.
Теперь я хотел бы выделить слова, найденные в результатах, используя, например, быстрый векторный маркер ES. Но я не нашел ни одного примера или какой-либо документации для этого.
Я думаю, мне нужно определить более правильный объект Query с помощью чего-то вроде :
$query = new ElasticaQuery();
$query->setHighlights(array("whatever"));
$query->setTerm("whatever");
$results = $finder->find($query);
Но я не могу найти никакой информации. Любой намек?
Большое спасибо!!
Ответ №1:
Сначала напишите запрос в формате JSON:
{
"query" : {
"match" : {
"content" : "this is a test"
}
},
"highlight" : {
"fields" : {
"content" : {}
}
}
}
Когда это сработает, переведите в Elastica:
$matchQuery = new ElasticaQueryMatch();
$matchQuery->setField('content', 'this is a test');
$searchQuery = new ElasticaQuery();
$searchQuery->setQuery($matchQuery);
$searchQuery->setHighlight(array(
"fields" => array("content" => new stdObject())
));
Комментарии:
1. Спасибо, Дэмиен! На самом деле документация FOSElasticaBundle довольно минимальна, поэтому мне пришлось погрузиться в исходный код, чтобы выяснить, какие методы у меня были, чтобы правильно перевести мой запрос Elasticsearch. В итоге я получил gist.github.com/tchapi/1ac99f757e0f336c1e1b что хорошо работает. Ваш совет написать запрос из первых рук мне все же помог 😉
Ответ №2:
Приведенный выше код не работал для меня, но изменение stdObject()
на stdClass()
сделало это идеальным! (ср. https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/62061993640d0894d512587a0cda10ca7eb13c28/Resources/doc/cookbook/attachments.md)
$searchQuery = new ElasticaQuery('This is a test');
$searchQuery->setFields(["content"]);
$searchQuery->setHighlight(array(
"fields" => array("content" => new stdClass())
));