В моем индексе документов ElasticSearch у меня есть свойство type
наподобие
type= LOCATION | PERSON | TIME
и поле text
, представляющее весь документ.
Для поиска типов, подобных LOCATION
и конкретный текст, например `Маунтин-Вью ', мне нравится
doc.text:Mountain View AND doc.type:LOCATION
Если я хочу выполнить запрос OR
, я бы вместо этого использовал подход query_string
, например
"query": {
"query_string": {
"query": "entity.text: (Mountain View OR Menlo Park) AND entity.type:LOCATION"
}
}
Это также работает.Для выполнения AND
запросов, таких как поиск item.text
с обоими «Mountain View» и «Menlo Park» для item.type=LOCATION
, это не работает, как
"query": {
"query_string": {
"query": "entity.text: (California AND Nevada) AND entity.type:LOCATION"
}
}
Другие попытки были:
Использование bool
предложения с should
, например:
{
"query": {
"bool": {
"should": [
{ "match": { "text": "Menlo Park" }},
{ "match": { "text": "Mountain View" }}
]
}
}
}
Использование cross-fields
с multi_match
"query": {
"multi_match": {
"query": "California Nevada",
"type": "cross_fields",
"operator": "AND",
"fields": [
"text"
]
}
}
Другой подход заключался в использовании must
с последним (в данном случае, кстати, опуская type
):
{
"query": {
"bool": {
"must": [
{
"multi_match" : {
"query": "Nevada",
"type": "cross_fields",
"fields": [ "text"],
}
},
{
"multi_match" : {
"query": "California",
"type": "cross_fields",
"fields": [ "text" ]
}
}
]
}
}
}
, но он также не возвращает результатов. Обратите внимание, что в последнем случаеиспользование should
вместо must
даст запрос OR
, который будет работать нормально.
Итак, как выполнить запрос AND
для того же поля text
для соответствия нескольким значениям, таким как California
и Nevada
?