Моя цель - найти значение по нескольким полям и вернуть количество этих значений и отдельное значение.Elasticsearch поиск значения по нескольким полям
Для этого я понял, что должен использовать грани.
Это схема базы данных:
index:
analysis:
analyzer:
custom_search_analyzer:
type: custom
tokenizer: standard
filter : [standard, snowball, lowercase, asciifolding]
custom_index_analyzer:
type: custom
tokenizer: standard
filter : [standard, snowball, lowercase, asciifolding, custom_filter]
filter:
custom_filter:
type: edgeNGram
side: front
min_gram: 1
max_gram: 20
{
"structure": {
"properties": {
"name": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"},
"locality": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"},
"province": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"},
"region": {"type": "string", "search_analyzer": "custom_search_analyzer", "index_analyzer": "custom_index_analyzer"}
}
}
}
и это вопрос, который я пытался использовать:
{
"query": {
"bool": {
"should": [
{
"match": {
"locality": "bolo"
}
},
{
"match": {
"region": "bolo"
}
},
{
"match": {
"name": "bolo"
}
}
]
}
},
"facets": {
"region": {
"query": {
"term": {
"region": "bolo"
}
}
},
"locality": {
"query": {
"term": {
"locality": "bolo"
}
}
},
"name": {
"query": {
"term": {
"name": "bolo"
}
}
}
}
}
Из всех тестов я сделал это запрос, который находится ближе всего к моему желаемому результату, однако, не говорит мне счет отдельного поля, я нашел его для подсчета общего поля.
Например, приведенный выше запрос возвращает следующий результат:
facets: {
region: {
_type: query
count: 0
}
locality: {
_type: query
count: 2
}
name: {
_type: query
count: 0
}
}
Я хотел бы иметь результат, как это (не так явно написано правильно, но понимаю, что мне нужно):
facets: {
....
locality: {
_type: query
"terms": [
{"term": "Bologna", "count": 1},
{"term": "Bolognano", "count": 1}
]
}
Как я могу это сделать?
Я уже пытался использовать «термины» вместо «запроса» в гране и поставить «index: not_analyzed» в области исследований, но возвращается только в том случае, если я попробую точную область действия, а не ее часть!
, если я вас правильно понял, вы хотите создать фасет фильтры, чтобы соответствовать только одно поле и один аспект, который охватывает все поля для общего количества. – phoet
Не совсем, мне жаль, что для всех граней мне не нужно возвращать общий счет, а содержимое поля, которое соответствует поиску, и количество найденного содержимого. В качестве примера я написал выше. Такая вещь получается с использованием грани 'terms' вместо' query', только 'terms' находит только точное совпадение поля! – Lughino