Пакет FOSElastica: получение основных моментов для результатов

#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())
));