2015-12-09 2 views
0

У меня есть этот запрос, который возвращает, если слово «mumbai» появляется в любом месте заголовка.Точный поиск запроса в elasticsearch

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "term": { 
      "title": "mumbai" 
     } 
     } 
    } 
    } 
} 

Так что результат содержит ...

mumbai 
mumbai ports 
financial capital mumbai 

Мне нужно возвращать только «Мумбай» термин, а не другие документы, в которых Mumbai слово, связанные с другими фразами. Верно только первый результат. Как отказаться от других результатов?


обновление

Этот запрос работает, как ожидалось, и в нем перечислены значения сортировки 58 (случайное значение), если матч точно.

curl -XPOST "localhost:9200/enwiki_content/page/_search?pretty" -d' 
{ 
    "fields": "title", 
    "query": { 
     "match": {"title": "Mumbai"} 
    }, 
    "sort": { 
    "_script": { 
     "script": "_source.title == \"Mumbai\" ? \"58\": \"78\";", 
     "type": "string" 

} 
} 
}' 

Мне нужно вернуть название, в котором соответствует точное Мумбаи (и, следовательно, значение сортировки 58). Как фильтровать или добавлять скрипт к параметру "fields"?

ответ

1

Чтобы получить Мумбай в соответствии с доком, который содержит только Мумбай и больше ничего, вы должны будете хранить маркер подсчет поля для поля вы ищете на. Это поле количества токенов будет содержать количество токенов, которые содержит поле. Используя это поле, вы можете сопоставить mumbai в своем поле заголовка и сопоставить поле token_count с количеством токенов в мумбаи (которое является одним). Обратите внимание, что token_count поля в других документах будет больше 1.

Для справки: https://www.elastic.co/guide/en/elasticsearch/reference/current/token-count.html

Примечания: Если вы используете стоп-слова, то вы должны знать о других предостережениях, связанных лексемы счетов. Вы можете найти информацию в приведенной выше ссылке.

0

Попробуйте запрос term. Он будет делать точный поиск матча

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "term": { 
         "title": "mumbai" 
        } 
       } 
      ] 
     } 
    } 
} 

Term запрос не будет соответствовать Мумбаи и Мумбае, он будет считаться разными словами

Второй вариант: Если вы можете изменить отображение, то вы можете установить title поле как not_analyzed

Третий вариант

match запроса с опцией анализатора

{ 
    "query": { 
    "match": { 
     "title": { 
     "query": "mumbai", 
     "analyzer": "keyword" 
     } 
    } 
    } 
} 
+0

Обратите внимание, что shantanuo уже имеет запрос терминов и просит другое решение. Таким образом, только ваш второй вариант будет жизнеспособным вариантом. – Val

+0

Shantanuo использует отфильтрованный запрос, который применяет фильтр в результате запроса match_all в приведенном выше случае. Также отфильтрованный запрос устарел в версии 2.0-бета https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html –

+0

Это не имеет значения, match_all является сквозным для всех документов. Было бы то же самое, если бы этого не было. Я хочу сказать, что ваш запрос и его эквивалент. 'отфильтрованный' может быть устаревшим в ES 2.0, но 1), который все еще работает, и 2) мы не знаем, использует ли он 2.0 или нет. На мой взгляд, это не проблема.Вместо этого я бы расширил ваш второй вариант, более вероятно, что он после. – Val

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