#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
}
}
]
}
}
}
- Вложенный запрос() = ищет значение xxx в адресах.постоянный адрес
- 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 с вложенностью сработал для меня, и с его помощью я могу проверить как родительское, так и вложенное свойство.