Соответствие возвращаемым записям запроса, только если запрос содержит все слова поля объекта

Я читал о совпадении и многословных запросах, но кажется, что мне нужно сделать что-то немного другое.

Допустим, у меня есть следующий запрос: «это тест», и я хочу найти этот запрос в одном поле под названием «текст». Я хочу получить объекты, которые соответствуют некоторым из этого запроса (не имеет значения, сколько слов), но только те объекты, значение запроса которых содержит каждое слово текстового поля.

Пример запроса: "это тест". Я хочу получить эти объекты:

obj1: {"text":"this is a test"}
obj2: {"text":"this is a"}
obj3 : { "text" : "is a" }
obj4 : { "text" : "test" }

Но если у obj есть что-то еще в текстовом поле, оно не будет возвращено, например:

obj5: {"text":"this is a test and something more"}

Можно ли добиться этого с помощью Elasticsearch?


person jgr    schedule 26.07.2015    source источник


Ответы (1)


Это своего рода хак, но мне удалось заставить его работать с фильтр сценариев:

POST /test_index/_search
{
   "query": {
      "match": {
         "text": "this is a test"
      }
   },
   "filter": {
      "script": {
         "script": "for(val in doc[\"text\"].values){ if(!(val in terms)){ return false; }}; return true;",
         "params": {
            "terms": ["this", "is", "a", "test"]
         }
      }
   }
} 

Я думал, что будет лучший способ сделать это, но не сразу смог его придумать. Использование сценариев может быть проблематичным в рабочей среде, если только ваш кластер ES не находится за какой-либо стеной аутентификации.

В любом случае, вот код, который я использовал для проверки:

http://sense.qbox.io/gist/3929abc89d71ebf724e6121b1b5ba6da54501088

person Sloan Ahrens    schedule 26.07.2015