Elasticsearch клиент высокого уровня отдыха более 1 поиска поля - PullRequest
0 голосов
/ 11 июля 2019

Я использую Scala 2.12 для запроса ElasticSearch (6.5).

Я могу использовать построители запросов для поиска по одному полю, как показано ниже:

val searchSourceBuilder = new SearchSourceBuilder()
val qb = new BoolQueryBuilder()
      .must(QueryBuilders.regexpQuery("header.fieldname", "01_.+_20190711_data"))
searchSourceBuilder.query(qb)

Используя вышеупомянутое (Iнужен поиск по регулярному выражению) Я могу искать соответствующие документы.

Однако у меня есть более сложное требование, в котором я должен сопоставить документы по нескольким парам поле-значение.

, т. е.

header.fieldname должен совпадать с шаблоном "01 _. + data" И заголовок.fieldname2 должен совпадать с шаблоном "type . + _ 2019-07-11"

По сути, это похоже наПредложение SQL где для 2 или более столбцов (и строки значений).

Я проверял https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html

Но это похоже на поиск одной и той же строки (значения) в нескольких полях.Это НЕ то, что я хочу.Я в основном хочу что-то вроде SQL AND в предложении where (лучше, если это тоже с regex).

UPDATE:

Обратите внимание на приведенный ниже ответ @Meet Rathod worksи принято.

Однако, чтобы продвинуться вперед, поэтому, если мне нужно еще одно условие, которое является SQL ИЛИ, мой код ниже верен.Требуется:

header.fieldname: 01_.+data AND header.fieldname2: type.+_2019-07-11 AND (header.fieldname3: some_thing OR header.fieldname3: some_other_thing)

Код:

val qb = new BoolQueryBuilder()
      .must(QueryBuilders.regexpQuery("header.fieldname", "01_.+_20190711_data"))
      .must(QueryBuilders.regexpQuery("header.fieldname2", "type.+_2019-07-11"))
.should(QueryBuilders.regexpQuery("header.fieldname3", "some_thing"))
.should(QueryBuilders.regexpQuery("header.fieldname3", "some_other_thing"))

Это правильно, или я что-то упустил?

1 Ответ

0 голосов
/ 12 июля 2019

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

{
  "query": {
    "bool": {
      "must": [
        {
          "regexp": {
            "header.fieldname": "01_.+data"
          }
        },
        {
          "regexp": {
            "header.fieldname2": "type.+_2019-07-11"
          }
        }
      ]
    }
  }
}

Я не уверен, но ваш код Scala должен выглядеть примерно так.

val qb = new BoolQueryBuilder()
      .must(QueryBuilders.regexpQuery("header.fieldname", "01_.+_20190711_data"))
      .must(QueryBuilders.regexpQuery("header.fieldname2", "type.+_2019-07-11"))

...