2016-08-21 3 views
1

У меня есть данные по индексу ElasticSearch, который выглядит как этотусловия Elasticsearch запроса на массиве значений

{ 
    "title": "cubilia", 
     "people": [ 
      "Ling Deponte", 
      "Dana Madin", 
      "Shameka Woodard", 
      "Bennie Craddock", 
      "Sandie Bakker" 
     ] 
    } 

Есть ли способ для меня, чтобы сделать поиск для всех людей, чье имя начинается с «лин» (должен быть нечувствительным к регистру) и получить четкие термины, правильно обложенные «Ling Deponte», а не «ling deponte»? Я нахожусь с изменяющимися отображениями по индексу любым способом.

Edit делает то, что я хочу, но на самом деле плохой запрос:

{ 
    "size": 0, 
    "aggs": { 
    "person": { 
     "filter": { 
     "bool":{ 
      "should":[ 
       {"regexp":{ 
        "people.raw":"(.*)?[lL][iI][nN][gG].*" 
       }} 
      ]} 
     }, 
     "aggs": { 
     "top-colors": { 
      "terms": { 
       "size":10, 
      "field": "people.raw", 
      "include": 
      { 
       "pattern": ["(.*)?[lL][iI][nN][gG].*"] 
      } 
      } 
     } 
     } 
    } 
    } 
} 

people.raw является not_analyzed

ответ

2

Да, и вы можете это сделать wi это регулярное выражение, используя возможности полного текста Elasticsearch.

GET /test/_search 
{ 
    "query": { 
    "match_phrase": { 
     "people": "Ling" 
    } 
    } 
} 

Примечание: Это также может быть match или match_phrase_prefix в этом случае. Запросы match_phrase* подразумевают порядок значений в тексте. match просто ищет любые значения. Поскольку у вас есть только одно значение, это почти не имеет значения.

Проблема заключается в том, что вы не можете ограничить ответы документа только этим именем, потому что API поиска возвращает документы. С учетом этого вы можете использовать документы nested и получить желаемое поведение через inner_hits.

Вы делаете не хотите использовать подстановочный знак, когда это возможно, потому что он просто не работает в масштабе. Чтобы выразить это в терминах SQL, это похоже на полное сканирование таблицы; вы фактически теряете преимущество инвертированного индекса, потому что он должен полностью пройти его, чтобы найти фактический старт.

Сочетание двух должно работать очень хорошо. Здесь я использую запрос, чтобы свести результаты к тому, что вас интересует, затем я использую ваше внутреннее агрегирование только для включения на основе значения.

{ 
    "size": 0, 
    "query": { 
    "match_phrase": { 
     "people": "Ling" 
    } 
    } 
    "aggs": { 
    "person": { 
     "terms": { 
     "size":10, 
     "field": "people.raw", 
     "include": { 
      "pattern": ["(.*)?[lL][iI][nN][gG].*"] 
     } 
     } 
    } 
    } 
} 
+0

Спасибо .. Сначала не использовал много полей и после добавления его я забыл. анализируемое поле. Как вы думаете, есть способ избавиться от «include»: {"pattern": ["(. *)? [LL] [iI] [nN] [gG]. *"]} А? У меня возникла идея сделать людей вложенными объектами с полем имени, но я не говорю о производительности. Могу ли я создавать вложенные объекты как объекты? –

+0

Вложенная производительность, особенно на одном уровне, очень хороша. Вы должны изменить его на «людей»: [{«name»: «Ling Deponte»}, {"name": "abc"}, ...] ', но тогда это сработает с использованием внутренних ударов с этим. [Внутренние хиты] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html) буквально выполняет второй запрос, но против небольшого подмножества он должен быть Хорошо. Это также полностью исключало бы агрегацию. – pickypg

0

Привет Вы можете найти запрос может помочь для вашего запроса

GET skills/skill/_search 
{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "wildcard": { 
       "skillNames.raw": "jav*" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

Мои намерение найти документы, начинающиеся с «jav»

+0

Благодарим за ответ, но это не приведет к возврату отдельных элементов массива, которые запускают «jav», но возвратят все термины в документе. –

Смежные вопросы