Можно ли установить параметр TYPE с помощью простого запроса строки запроса в Elasti c Поиск - PullRequest
1 голос
/ 30 марта 2020

При использовании запроса строки запроса в ES и сопоставлении нескольких полей я могу установить параметр TYPE, чтобы настроить способ объединения / оценки ES при сопоставлении в нескольких полях.

например, я хочу чтобы сопоставить два поля в моем индексе и объединить оценки из обоих полей

GET /_search
{
    "query": {
        "query_string" : {
            "query" : "test",
            "fields": ["titel", "content"],
            "type": "most_fields"
      }
    }
}

Параметр, похоже, отсутствует, используя simple строку запроса . Каков режим по умолчанию для простой строки запроса? Как баллы выбираются / комбинируются? Можно ли установить тип.

1 Ответ

0 голосов
/ 11 апреля 2020

Простая строка запроса не имеет параметра типа. Он получает сумму баллов по каждому полю.

Рассмотрим приведенный ниже индекс и посмотрим, как различные запросы рассчитывают балл, используя объяснение api

Отображение:

PUT testindex6
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text"
      },
      "description":{
        "type": "text"
      }
    }
  }
}

Данные:

POST testindex6/_doc
{
  "title":  "dog",
  "description":"dog is brown"
}

1. Query_string best_fields (по умолчанию)

Находит документы, соответствующие любому полю, но использует _score из лучшего поля

GET testindex6/_search?explain=true
{
  "query": {
    "query_string": {
      "default_field": "*",
      "query": "dog brown",
      "type":"best_fields"
    }
  }
}

Результат:

  "_explanation" : {
          "value" : 0.5753642,
          "description" : "max of:",
          "details" : [
            {
              "value" : 0.5753642,
              "description" : "sum of:",              
            },
            {
              "value" : 0.2876821,
              "description" : "sum of:",              
            }
          ]
        }   

Best_fields получает максимальный балл из соответствующих полей

2. Query_string most_fields

Does sum of scores from matched fields
GET testindex6/_search?explain=true
{
  "query": {
    "query_string": {
      "default_field": "*",
      "query": "dog brown",
      "type":"most_fields"
    }
  }
}

Результат

"_explanation" : {
          "value" : 0.8630463,
          "description" : "sum of:",
          "details" : [
            {
              "value" : 0.5753642,
              "description" : "sum of:"
              ....
            },
            {
              "value" : 0.2876821,
              "description" : "sum of:"              
              ....
            }
          ]
        }
      }

3. Simple_Query_String

Запрос

GET testindex6/_search?explain=true
{
  "query": {
    "simple_query_string": {
      "query": "dog brown",
      "fields": ["*"]
    }
  }
}

Результат:

"_explanation" : {
          "value" : 0.8630463,
          "description" : "sum of:",
          "details" : [
            {
              "value" : 0.5753642,
              "description" : "sum of:",              
            },
            {
              "value" : 0.2876821,
              "description" : "sum of:"              
            }
          ]
        }
      }

Таким образом, вы можете видеть, что оценка одинакова в most_fields и simple_query_string (оба имеют сумму). Но в них есть разница. Ниже приведен указатель

. Я создал заголовок поля с типом текста и подполя черепицы с анализатором черепицы.

PUT index_2
{
  "settings": {
    "analysis": {
      "analyzer": {
        "analyzer_shingle": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "shingle"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "fields": {
          "shingles": {
            "search_analyzer": "analyzer_shingle",
            "analyzer": "analyzer_shingle",
            "type": "text"
          }
        }
      }
    }
  }
}

Данные:

POST index_2/_doc
{
  "title":"the brown fox"
}

1. Most_fields Запрос:

GET index_2/_search?explain=true
{
  "query": {
    "query_string": {
      "query": "brown fox",
      "fields": ["*"],
      "type":"most_fields"
    }
  }
}

Результат:

"_explanation" : {
          "value" : 1.3650365,
          "description" : "sum of:",
          "details" : [
            {
              "value" : 0.7896724,
              "description" : "sum of:",              
            },
            {
              "value" : 0.5753642,
              "description" : "sum of:",              
            }
          ]
        }

2. Simple_Query_string Запрос

GET index_2/_search?explain=true
{
  "query": {
    "simple_query_string": {
      "query": "brown fox",
      "fields": ["*"]
    }
  }
}

Результат:

"_explanation" : {
          "value" : 1.2632996,
          "description" : "sum of:",
          "details" : [
            {
              "value" : 0.6316498,
              "description" : "sum of:",              
            },
            {
              "value" : 0.6316498,
              "description" : "sum of:"              
            }
          ]
        }
      }

Если вы увидите, что счет в большинстве_филдов и simple_query_string отличается, хотя оба имеют сумму баллов.

Причина в том, что most_fields использует анализатор полей при запросах, помните, что заголовки (стандартные) и заголовки (гитарный анализатор) имеют разные анализаторы, тогда как simple_query_string использует анализатор индекса по умолчанию (стандартный) для всех полей.

Если мы запросим most_fields и заставим его использовать стандартный анализатор, вы получите тот же запрос:

GET index_2/_search?explain=true
{
  "query": {
    "query_string": {
      "query": "brown fox",
      "fields": ["*"],
      "type":"most_fields",
      "analyzer": "standard"-->instead of field analyzer respectively use standard for all
    }
  }
}

Результат:

"_explanation" : {
          "value" : 1.2632996,
          "description" : "sum of:"
          "details" : [
            {
              "value" : 0.6879354,
              "description" : "sum of:"
            },
            {
              "value" : 0.5753642,
              "description" : "sum of:"              
            }
          ]
        }

simple_query_string Я думаю, что для простого сценария ios, если вы используете разные анализаторы для разных полей, используйте запросы simple_query_string или bool-match

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