Elasticsearch, как использовать multi_match с подстановочными знаками
У меня есть объект User со свойствами Имя и Фамилия. Я хочу искать в этих полях с помощью одного запроса, и я нашел multi_match
в документации, но я не знаю, как правильно использовать это с подстановочным знаком. Является ли это возможным?
Я попытался выполнить запрос multi_match
, но он не сработал:
{
"query": {
"multi_match": {
"query": "*mar*",
"fields": [
"user.name",
"user.surname"
]
}
}
}
Ответы
Ответ 1
В качестве альтернативы вы можете использовать запрос query_string
с подстановочными знаками.
"query": {
"query_string": {
"query": "*mar*",
"fields": ["user.name", "user.surname"]
}
}
Это будет медленнее, чем использование фильтра nGram по индексу времени (см. мой другой ответ), но если вы ищете быстрое и грязное решение...
Также я не уверен в вашем сопоставлении, но если вы используете user.name
вместо name
, ваше сопоставление должно выглядеть следующим образом:
"your_type_name_here": {
"properties": {
"user": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"surname": {
"type": "string"
}
}
}
}
}
Ответ 2
Такой запрос работал у меня:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"should": [
{"query": {"wildcard": {"user.name": {"value": "*mar*"}}}},
{"query": {"wildcard": {"user.surname": {"value": "*mar*"}}}}
]
}
}
}
}
}
Подобно тому, что вы делаете, за исключением того, что в моем случае могут быть разные маски для разных полей.
Ответ 3
Я только что сделал это сейчас:
GET _search {
"query": {
"bool": {
"must": [
{
"range": {
"theDate": {
"gte": "2014-01-01",
"lte": "2014-12-31"
}
}
},
{
"match" : {
"Country": "USA"
}
}
],
"should": [
{
"wildcard" : { "Id_A" : "0*" }
},
{
"wildcard" : { "Id_B" : "0*" }
}
],"minimum_number_should_match": 1
}
}
}
Ответ 4
Я бы не использовал подстановочные знаки, он не будет хорошо масштабироваться. Вы запрашиваете много поисковой системы во время запроса. Вы можете использовать фильтр nGram, чтобы выполнить обработку в режиме index-time not search time.
См. это обсуждение фильтра nGram.
После правильной индексации name
и surname
(измените свое сопоставление, есть примеры в приведенной выше ссылке), вы можете использовать многозадачность, но без подстановочных знаков и получать ожидаемые результаты.
Ответ 5
Подобно предложению выше, но это просто и работает для меня:
{
"query": {
"bool": {
"must":
[
{
"wildcard" : { "processname.keyword" : "*system*" }
},
{
"wildcard" : { "username" : "*admin*" }
},
{
"wildcard" : { "device_name" : "*10*" }
}
]
}
}
}