Поиск по нескольким полям с помощью Elastic Search

Я новичок в поиске эластичности, и мне интересно, как я могу выполнить поиск, указав одно или несколько полей.

С SQL я бы написал этот запрос:

"SELECT field1, field2, field3 FROM tablename WHERE field1 = 'X' AND field2 != 'Y' AND field3 = 'Z'"

В Elastic Search Я начинаю с этого:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query": "*"
                }
            },
            "filter": {
                "term" : {
                    "field1" : "286"
                }
            }
        }
    }
}

Ответ 1

Вы должны выбрать правильный запрос для работы, которая может быть трудной в начале. Вы можете определенно использовать запрос bool, чтобы объединить все виды различных запросов, как уже предлагалось. Существуют также запросы, которые позволяют выполнять несколько полей и сопоставлять с булевыми запросами внутри. Кроме того, термины запросов не так часто встречаются в производственной системе, поскольку они не поддерживают какой-либо анализ текста, в то время как обычно вы хотите анализировать запрос так, как это происходит при индексации поля, которое вы запрашиваете.

Одним из наиболее распространенных запросов вasticsearch является запрос на совпадение, который работает с одним полем. И еще один запрос с теми же параметрами, который работает также для нескольких полей, называется multi_match. Эти запросы поддерживают анализ текста и работают очень хорошо. Я бы предложил использовать их, например, для запроса query_string, который намного более мощный, но также подвержен ошибкам из-за необходимого процесса синтаксического анализа. Я бы сказал, что используйте query_string только в том случае, если вам конкретно нужна одна из его функций (например, указание имен полей или логических операторов внутри самого запроса), в противном случае используйте запросы на совпадение.

Также важно понимать разницу между запросами и фильтрами, посмотрите здесь, чтобы узнать больше.

И взгляните на все запросы, доступные в запросе DSL, и поиграйте с ними, просто чтобы почувствовать все, что вы можете сделать.

Ответ 2

Запрос sql эквивалентен:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "field1": "X"
          }
        },
        {
          "term": {
            "field3": "Z"
          }
        }
      ],
      "must_not": {
        "term": {
          "field2": "Y"
        }
      }
    }
  }
}

В любом случае я рекомендую вам немного прочитать документ, прежде чем начинать с elasticsearch, если вы новичок.

Существует множество типов запросов, и некоторые из них зависят от того, как вы индексируете свои данные, например, для строк, вы можете анализировать строки (строчные, стековые слова, удалять стоп-слова,...) во время индекса. Выбранный запрос никогда не будет соответствовать документу, поле 1 которого "X", если вы проанализируете это поле в индексном времени и преобразуете его в нижний регистр.

Как только вы узнаете немного лучше elasticsearch, вы можете использовать фильтры для улучшения ваших запросов.

Ответ 3

Я бы предложил начать с запроса Elastic Simple. Это более SQL-как и проще для понимания. Ссылка: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html

Синтаксис запроса будет выглядеть, например, если вы пытаетесь найти гостя с именем John AND фамилия Doe:

GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "John + Doe",
        "fields": ["guest"],
        "default_operator": "and"
    }
  }
}

Если какой-либо из этих критериев не будет совпадать, запрос не вернет ни одного совпадения. Кроме того, здесь вы можете искать по нескольким полям, но это будет медленнее, чем поиск по одному полю. Кроме того, согласно документам, простой запрос поддерживает специальные символы в качестве логических\поисковых операторов:

 '+' signifies AND operation | signifies OR operation
 '-' negates a single token " wraps a number of tokens to signify a phrase for searching
 '*' at the end of a term signifies a prefix query