Подтвердить что ты не робот

Elasticsearch, как использовать multi_match с подстановочными знаками

У меня есть объект User со свойствами Имя и Фамилия. Я хочу искать в этих полях с помощью одного запроса, и я нашел multi_match в документации, но я не знаю, как правильно использовать это с подстановочным знаком. Является ли это возможным?

Я попытался выполнить запрос multi_match, но он не сработал:

{
    "query": {
        "multi_match": {
            "query": "*mar*",
            "fields": [
                "user.name",
                "user.surname"
            ]
        }
    }
}
4b9b3361

Ответ 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*" }
            }
        ]
    }
}
}