Искать несколько значений, но останавливать поиск при обнаружении точного совпадения

Поэтому я реализовал базовый поиск с помощью elasticSearch. Как сделать поисковый запрос таким, чтобы:

если (получить точное соответствие AccountId:CMRZ)

{

  return me just that one account with id:CMRZ

}

еще

   return me accounts that have ids like id:CMRZ12, id:98CMRZ12 etc.

Я пробовал следующее, но это не работает, если в моем идентификаторе есть дефис: http://localhost:9200/account/useraccounts/_search?q=id:"* CMRZ*"

если я отправлю ‹--> результат.

1-ЦМРЗ-121 ‹--> 1-ЦМРЗ-121

1-ЦМРЗ- ‹--> 1-ЦМРЗ-121 ,1-ЦМРЗ-165

НО

1-CMR ‹--> НУЛЕВОЙ ОТВЕТ

Таким образом, теперь я знаю, что проблема с дефисом. Есть ли способ предотвратить это, чтобы я получил следующий ответ?

1-ЦМР ‹--> 1-ЦМРЗ-971,1-ЦМРЗ-121, 1-ЦМРЗ-165


person SSB    schedule 21.01.2020    source источник


Ответы (2)


Вы можете использовать API множественного поиска (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html). Отправьте сюда два запроса — один с точным совпадением, а другой с токенами. В вашем коде вы можете решить, какой из них взять.

Если вы хотите сделать это за два вызова, вы можете сделать их один за другим и только второй раз, если это необходимо.

person Ashish Modi    schedule 21.01.2020

Вы можете использовать для этого логическое условие «следует» с запросом термина для точного совпадения и добавить повышение, чтобы оно было сначала, а затем совпадение для учетных записей, похожих на ваш идентификатор.

https://www.elastic.co/guide/en/elasticsearch/reference/7.5/query-dsl-bool-query.html

https://www.elastic.co/guide/en/elasticsearch/reference/7.5/query-dsl-term-query.html#

https://www.elastic.co/guide/en/elasticsearch/reference/7.5/query-dsl-match-query.html

POST _search
{
  "query": {
    "bool" : {
      "should" : [
        {"term" : { "id" : "CMRZ", "boost": 3.0 }},
        {"match": {"id": {"query": "CMRZ"}}
      ]
}}} 
person Gabriel    schedule 21.01.2020