Частичный поиск по шаблону в Elasti c Поиск - PullRequest
0 голосов
/ 16 марта 2020

Я хочу выполнить поиск по значению массива в Elasti c Поиск с использованием подстановочного знака.

enter image description here

{
    "query": {
        "wildcard": {
            "short_message": {
                "value": "*nne*",
                "boost": 1.0,
                "rewrite": "constant_score"
            }
        }
    }
}

Я выполняю поиск по "short_messages" Это работает на меня. Но я хочу найти «messages.message», это не работает.

{
    "query": {
        "wildcard": {
            "messages.message": {
                "value": "*nne*",
                "boost": 1.0,
                "rewrite": "constant_score"
            }
        }
    }
}

И я также хочу найти несколько полей в массиве.

Например: - fields: [ "messages.message", "messages.subject", "messages.email_search"]

Тогда можно дать мне лучшие решения.

Заранее спасибо.

1 Ответ

0 голосов
/ 16 марта 2020

Похоже, вы используете nested тип данных для messages.

Для этого вам нужно будет использовать nested query:

POST <your_index_name>/_search
{
  "query": {
    "nested": {
      "path": "messages",
      "query": {
        "wildcard": {
          "messages.message": {
            "value": "*nne*",
            "boost": 1
          }
        }
      }
    }
  }
}

Для многополевых запросов вы, вероятно, можете сделать это, используя query_string, поэтому в основном ваше решение будет использовать query_string внутри nested query.

Строка запроса:

POST <your_index_name>/_search
{
  "query": {
    "nested": {
      "path": "messages",
      "query": {
        "query_string": {
          "fields": ["messages.message", "messages.subject"],
          "query": "*nne*",
          "boost": 1
        }
      }
    }
  }
}

Запрос DSL

Вы также можете использовать wildcard, используя Query DSL, но опять же, вам нужно добавить несколько предложений запроса Я подозреваю, что для каждого поля из соображений производительности подстановочные запросы не поддерживают многополевые запросы.

POST <your_index_name>/_search
{
  "query": {
    "nested": {
      "path": "messages",
      "query": {
        "bool": {
          "should": [
            {
              "wildcard": { 
                "messages.message": {
                  "value": "*nne*",
                  "boost": 1
                }
              }
            },
            {
              "wildcard": {
                "messages.subject": {
                  "value": "*nne*",
                  "boost": 1
                }
              }
            }
          ]
        }
      }
    }
  }
}

Обратите внимание, что поиск по шаблону не рекомендуется из-за количества операций регулярного выражения, которые он должен выполнять, и это повлияет на вашу задержку, чтобы получить ответ, вместо этого я рекомендую вам взглянуть на Ngram Tokenizer Таким образом, вы можете использовать простой запрос на совпадение, чтобы получить желаемый результат.

Дайте мне знать, если это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...