Настройки сортировки Elasticsearch по индексу, дающие странные результаты - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть индекс, настроенный так:

PUT items
{
  "settings": {
    "index": {
      "sort.field": ["popularity", "title_keyword"],
      "sort.order": ["desc", "asc"]
    },
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "tokenizer": "autocomplete",
          "filter": [
            "lowercase"
          ]
        },
        "autocomplete_search": {
          "tokenizer": "lowercase"
        }
      },
      "tokenizer": {
        "autocomplete": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 15,
          "token_chars": [
            "letter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "autocomplete",
        "search_analyzer": "autocomplete_search"
      },
      "title_keyword": {
        "type": "keyword"
      },
      "popularity": {
        "type": "integer"
      },
      "visibility": {
        "type": "keyword"
      }
    }
  }
}

Со следующими данными:

POST items/_doc/1
{
  "title": "The Arbor",
  "popularity": 5,
  "title_keyword": "The Arbor",
  "visibility": "public"
}

POST items/_doc/2
{
  "title": "The Canon",
  "popularity": 10,
  "title_keyword": "The Canon",
  "visibility": "public"
}

POST items/_doc/3
{
  "title": "The Brew",
  "popularity": 15,
  "title_keyword": "The Brew",
  "visibility": "public"
}

Я выполняю этот запрос на данных:

GET items/_search
{
  "size": 3,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": {
              "query": "the", 
              "operator": "and"
            }
          }
        },
        {
          "match": {
            "visibility": "public"
          }
        }
      ]
    }
  },
  "highlight": {
    "pre_tags": ["<mark>"],
    "post_tags": ["</mark>"], 
    "fields": {
      "title": {}
    }
  }
}

Похоже, что записи в слове the совпадают правильно, но сортировка не работает. Я ожидал бы, что он будет отсортирован по популярности, как определено, и результаты будут The Arbor, The Brew, The Canon в этом порядке, но результаты, которые я получу, следующие:

{
  "took" : 11,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 0.27381438,
    "hits" : [
      {
        "_index" : "items",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.27381438,
        "_source" : {
          "title" : "The Brew",
          "popularity" : 15,
          "title_keyword" : "The Brew",
          "visibility" : "public"
        },
        "highlight" : {
          "title" : [
            "<mark>The</mark> Brew"
          ]
        }
      },
      {
        "_index" : "items",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.26392496,
        "_source" : {
          "title" : "The Arbor",
          "popularity" : 5,
          "title_keyword" : "The Arbor",
          "visibility" : "public"
        },
        "highlight" : {
          "title" : [
            "<mark>The</mark> Arbor"
          ]
        }
      },
      {
        "_index" : "items",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.26392496,
        "_source" : {
          "title" : "The Canon",
          "popularity" : 10,
          "title_keyword" : "The Canon",
          "visibility" : "public"
        },
        "highlight" : {
          "title" : [
            "<mark>The</mark> Canon"
          ]
        }
      }
    ]
  }
}

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

GET items/_search
{
  "size": 3,
  "sort": [
    {
      "popularity": {
        "order": "desc"
      }
    },
    {
      "title_keyword": {
        "order": "asc"
      }
    }
  ], 
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": {
              "query": "the", 
              "operator": "and"
            }
          }
        },
        {
          "match": {
            "visibility": "public"
          }
        }
      ]
    }
  },
  "highlight": {
    "pre_tags": ["<mark>"],
    "post_tags": ["</mark>"], 
    "fields": {
      "title": {}
    }
  }
}

Я прочитал, что включение сортировки в запрос, как это, неэффективно, и включить его в настройки. Не делаю ли я что-то при создании индекса, чтобы по умолчанию он был отсортирован по популярности? Приводит ли включение параметров сортировки в запрос к неэффективным запросам? Или мне действительно нужно включать его в каждый запрос?

Надеюсь, это имеет смысл! Спасибо

1 Ответ

0 голосов
/ 03 февраля 2020

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

Если ваш поиск отличается от индекса или вообще не сортирует сортировка индекса не имеет значения.

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

...