Как мне выполнить запрос, вложенный в обычный запрос соответствия вместе?

#elasticsearch #elastic-stack #elasticsearch-5

Вопрос:

Я хочу запустить вложенный запрос по адресам и многоматчевый запрос по имени в одном запросе. Я попробовал несколько способов, но я получаю «запрос[bool] не поддерживает [вложенный]». Я не знаю, возможно ли это или нет (версия ES: 7.x).

Когда я отдельно запрашиваю (т. е. вложенный запрос () и multiMatchQuery ()), в этот раз он работает нормально. Пожалуйста, помогите мне с этим. Это отображение, которое я использую:

 {
  "employee" : {
    "mappings" : {
      "properties" : {
        "addresses" : {
          "type" : "nested",
          "properties" : {
            "permanentAddress" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "TemporaryAddress" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "id" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}



1.    {
      "query": {
        "nested": {
          "path": "addresses",
          "query": {
            "bool": {
              "must": [
                { "match": { "addresses.permanentAddress": "xxx" } }
          
              ]
            }
          },
          "score_mode": "avg"
        }
      }
    }
    
2.    {
     "query": {
        "bool": {
            "must" : [
              {
                "multi_match" : {
                  "query" : "xxx",
                  "fields" : [
                    "name^1.0"
                  ],
                  "type" : "best_fields",
                  "boost" : 1.0
                }
              }
            ]
        }
      }
    }
 
  1. Вложенный запрос() = ищет значение xxx в адресах.постоянный адрес
  2. multi_match() = ищет значение xxx в имени

Если значение name или addresses.permanentAddress совпадает с xxx, то возвращается результат.

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

1. не могли бы вы поделиться запросами, которые вы хотите объединить ?

2. Спасибо за эскодер ответа, BoolQueryBuilder QueryBuilder = QueryBuilders.boolQuery().должен(QueryBuilders .multiMatchQuery(«xxx», имя)); запрос QueryBuilder = QueryBuilders.boolQuery().должен(QueryBuilders.matchQuery( «адреса.постоянный адрес», «xxx»)); Вложенный QueryBuilder Вложенный запрос = QueryBuilders .Вложенный запрос(«адреса», запрос, режим оценки.Нет). innerHit(новый InnerHitBuilder()); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery().фильтр(вложенный запрос);

3. Извините за формат @ESCoder . В комментарии avobe я предоставил api java, и в описании я добавил эти запросы . На самом деле эти два запроса должны быть с (оператор.или), он проверяет наличие multiMatchQuery() или вложенного запроса()

Ответ №1:

   "bool" : {
"should" : [
  {
    "bool" : {
      "must" : [
        {
          "match" : {
            "name" : {
              "query" : "xxx",
              "operator" : "AND",
              "prefix_length" : 0,
              "max_expansions" : 50,
              "fuzzy_transpositions" : true,
              "lenient" : false,
              "zero_terms_query" : "NONE",
              "auto_generate_synonyms_phrase_query" : true,
              "boost" : 1.0
            }
          }
        }
      ],
      "adjust_pure_negative" : true,
      "boost" : 1.0
    }
  },
  {
    "nested" : {
      "query" : {
        "bool" : {
          "must" : [
            {
              "match" : {
                "employee.permanentAddress" : {
                  "query" : "xxx",
                  "operator" : "AND",
                  "prefix_length" : 0,
                  "max_expansions" : 50,
                  "fuzzy_transpositions" : true,
                  "lenient" : false,
                  "zero_terms_query" : "NONE",
                  "auto_generate_synonyms_phrase_query" : true,
                  "boost" : 1.0
                }
              }
            }
          ],
          "adjust_pure_negative" : true,
          "boost" : 1.0
        }
      },
      "path" : "employee",
      "ignore_unmapped" : false,
      "score_mode" : "none",
      "boost" : 1.0,
    }
  }
],
"adjust_pure_negative" : true,
"boost" : 1.0
 

}

Этот запрос Bool с вложенностью сработал для меня, и с его помощью я могу проверить как родительское, так и вложенное свойство.