2015-08-18 2 views
0

Я хочу реализовать функцию поиска имени магазина, теперь, если я напишу название магазина «nite out», тогда я хочу, чтобы мои результаты содержали все подстрочные строки «nite» и «out» и «nite out».Какой запрос использовать в Elasticsearch tp выполняет все подстрочные совпадающие результаты?

Я попытался использовать префиксный запрос, но не смог выполнить это. Я слышал о нечетком запросе, но не знаю, решит ли он мою проблему или нет.

Может кто-нибудь скажет мне, какой запрос ES я должен использовать, чтобы получить «конечные результаты» в верхней части и остальные «конечные» и «выходные» результаты также, но ниже «конечный результат».

ответ

2

Я буду считать, что ваши данные уже проиндексированы таким образом, что nite, out и nite out являются жетонами, соответствующими любым документам.

Одним из способов сделать это было бы использование Match Query. В запросе Match используется анализатор для получения этого fuzziness, который вы ищете. В этом конкретном случае мы могли бы использовать анализатор пробелов, чтобы получить результаты, которые вы ищете. Он рассмотрит запрос nite out и разделит его на nite и out. Затем запрос соответствия будет искать эти два токена и оценивать по релевантности. Документ с nite out проанализирован как как nite, так и out будет иметь более высокий балл, чем документ с nite или out самостоятельно.

Вот пример три документа, используя динамическое отображение:

индекса наших Документы

PUI {"value":"out"} 
PUT {"value":"nite"} 
PUT {"value":"nite out"} 

Теперь построит запрос:

GET _search 
{ 
    "query": { 
     "match": { 
     "value": { 
      "query": "nite out", 
      "analyzer": "whitespace" 
     } 
     } 
    } 
} 

Мы на самом деле не нужны указать Здесь мы можем просто удалить эту строку (и предыдущую запятую). Запрос соответствия будет запускать текст запроса над анализатором, используемым полем, которое мы запрашиваем во время индекса. В нашем случае это стандартный анализатор, который разбивает текст на nite и out.

Результаты:

"hits": [ 
     { 
      "_index": "test", 
      "_type": "test", 
      "_id": "1", 
      "_score": 0.2712221, 
      "_source": { 
       "value": "nite out" 
      } 
     }, 
     { 
      "_index": "test", 
      "_type": "test", 
      "_id": "2", 
      "_score": 0.04500804, 
      "_source": { 
       "value": "nite" 
      } 
     }, 
     { 
      "_index": "test", 
      "_type": "test", 
      "_id": "3", 
      "_score": 0.04500804, 
      "_source": { 
       "value": "out" 
      } 
     } 
     ] 

Я призываю вас читать над this link here, чтобы узнать о различных механизмах поиска в elasticsearch

+0

может у пожалуйста скажите мне одну вещь, на самом деле я хочу «Nite из» для поиска так что строки точно совпадают с «конечным» ИЛИ «вне» в качестве префикса, пожалуйста, скажите мне, что то, что я могу использовать, будет действительно полезно и действительно спасибо за ваш ответ. –

+0

К сожалению, я не уверен, что вы имеете в виду. Покажите некоторые примеры того, что вы хотите согласовать, и то, что вы не хотите согласовывать в своем вопросе. – IanGabes

+0

ok, например, если я ищу «nite out», тогда ответы будут «nite *», где * означает anyting или ничего, OR «out *», короче говоря, я хочу, чтобы мой первый термин перед пробелом был точным, а второй - префиксом любой строки. Мне нужны оба ответа –

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

  • Нет связанных вопросов^_^