Эластичный поиск запрос точного соответствия с поиском по подстановочным знакам для нескольких полей

#elasticsearch #elasticsearch-query

Вопрос:

У меня есть хранилище данных эластичного поиска, как показано ниже, и мне нужно написать несколько поисковых запросов по этим данным с точным совпадением и точным совпадением *(подстановочный знак)

 [
  {
    "id": "123",
    "name": "test123 abc bct",
    "externalObj": {
      "id": "abc 123"
    }
  },
  {
    "id": "124",
    "name": "test124 abc bct",
    "externalObj": {
      "id": "abc 124"
    }
  }
]
 

в настоящее время я написал запрос, как показано ниже,

 {
  "query": {
    "query_string": {
      "fields": [
        "name^5",
        "id",
        "externalObj.*"
      ],
      "query": "(test124 abc)",
      "default_operator": "AND"
    }
  }
}
 

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

например: «запрос»: «test124 ab»

Кто-нибудь может мне помочь в решении вышеуказанной проблемы ?

Ответ №1:

Есть 2 варианта достижения того, чего вы хотите. Вы можете выбрать один из них для использования:

  1. Установите default_operator значение OR (или просто удалите его, так как значение по умолчанию равно OR ).
 {
  "query": {
    "query_string": {
      "fields": [
        "name^5",
        "id",
        "externalObj.*"
      ],
      "query": "test124 a"
    }
  }
}
 
  1. Измените свой запрос на test124 a*
 {
  "query": {
    "query_string": {
      "fields": [
        "name^5",
        "id",
        "externalObj.*"
      ],
      "query": "test124 a*",
      "default_operator": "AND"
    }
  }
}
 

Комментарии:

1. с вашим предложением точное совпадение работает нормально, и частичное совпадение также работает нормально для одного сценария, он работает для «test124 abc*», но не для «test124 ab*».

2. Это странно. И то, и другое прекрасно работает для меня. Сохранил ли ты свое default_operator «как AND «, когда пытался test124 ab* ?

3. да, если мы удалим default_operator: «И», он получит ненужные результаты с правильными объектами, а также без правильного порядка сортировки для ввода запроса, который мы задали

4. просто я хочу получить результат «test124 abc bct» для «запроса»: «test124 a»

5. Я обновил свой ответ примерами запросов. Пожалуйста, попробуйте их. Для обоих вариантов я возвращаюсь test124 abc bct .