Elasticsearch NGram Analyzer - Изменить порядок результатов запроса - PullRequest
0 голосов
/ 06 января 2019

Elasticsearch Query изменить результаты отображения в соответствии с оценкой

Текущий запрос дает результат заголовка поля в следующем порядке.

  1. Быстрый 123
  2. Лисы Quick
  3. Quick
  4. Лис Быстро, Быстро
  5. Быстрые лисицы

Не должен 3. Быстро стать первым результатом вместо этого?

Кроме того, Foxes Quick Quick имеет два вхождения Quick, ему следует отдавать предпочтение в результате запроса. Но это прибывает в 4-ом poistion.

Настройки указателя.

 {
 "fundraisers": {
    "settings": {
      "index": {
        "number_of_shards": "5",
        "provided_name": "fundraisers",
        "creation_date": "1546515635025",
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "filter": [
                "lowercase"
              ],
              "tokenizer": "my_tokenizer"
            },
            "search_analyzer_search": {
              "filter": [
                "lowercase"
              ],
              "tokenizer": "search_tokenizer_search"
            }
          },
          "tokenizer": {
            "my_tokenizer": {
              "token_chars": [
                "letter",
                "digit"
              ],
              "min_gram": "3",
              "type": "edge_ngram",
              "max_gram": "50"
            },
            "search_tokenizer_search": {
              "token_chars": [
                "letter",
                "digit",
                "whitespace"
              ],
              "min_gram": "3",
              "type": "ngram",
              "max_gram": "50"
            }
          }
        },
        "number_of_replicas": "1",
        "uuid": "mVweO4_sT3Ww00MzdLyavw",
        "version": {
          "created": "6020399"
        }
      }
    }
  }
}

Query 

GET fundraisers/_search?explain=true

{
  "query": {
    "match_phrase": {
      "title": {
        "query": "qui",
        "analyzer": "my_analyzer"
        }
    }
  }
}
Mapping
{
  "fundraisers": {
    "mappings": {
      "fundraisers": {
        "properties": {
          "status": {
            "type": "text"
          },
          "suggest": {
            "type": "completion",
            "analyzer": "simple",
            "preserve_separators": true,
            "preserve_position_increments": true,
            "max_input_length": 50
          },
          "title": {
            "type": "text",
            "analyzer": "my_analyzer"
          },
          "twitterUrl": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "videoLinks": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "zipCode": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

Я слишком усложняю это, используя match_phrase, анализатор поиска и ngrams, или есть какой-то более простой способ достичь ожидаемого результата?

Ref: https://www.elastic.co/guide/en/elasticsearch/reference/6.5/query-dsl-match-query.html

1 Ответ

0 голосов
/ 12 января 2019

Хорошо, сначала давайте создадим минимальную и воспроизводимую установку:

PUT test
{
  "settings": {
    "index": {
      "number_of_shards": "1",
      "number_of_replicas": "1",
      "analysis": {
        "analyzer": {
          "my_analyzer": {
            "filter": [
              "lowercase"
            ],
            "tokenizer": "my_tokenizer"
          },
          "search_analyzer_search": {
            "filter": [
              "lowercase"
            ],
            "tokenizer": "search_tokenizer_search"
          }
        },
        "tokenizer": {
          "my_tokenizer": {
            "token_chars": [
              "letter",
              "digit"
            ],
            "min_gram": "3",
            "type": "edge_ngram",
            "max_gram": "50"
          },
          "search_tokenizer_search": {
            "token_chars": [
              "letter",
              "digit",
              "whitespace"
            ],
            "min_gram": "3",
            "type": "ngram",
            "max_gram": "50"
          }
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "my_analyzer"
        }
      }
    }
  }
}

PUT test/_doc/1
{
  "title": "Quick 123"
}
PUT test/_doc/2
{
  "title": "Foxes Quick"
}
PUT test/_doc/3
{
  "title": "Quick"
}
PUT test/_doc/4
{
  "title": "Foxes Quick Quick"
}
PUT test/_doc/5
{
  "title": "Quick Foxes"
}

Тогда давайте попробуем самый простой запрос:

GET test/_search
{
  "query": {
    "match": {
      "title": {
        "query": "qui"
        }
    }
  }
}

А теперь ваш заказ:

  1. Quick
  2. Лис Быстро, Быстро
  3. Быстрый 123
  4. Лисы Quick
  5. Быстрые лисы

Это в значительной степени то, что вы ожидали, верно? Могут быть и другие варианты использования, которые не охватываются этим запросом, но IMO вам придется использовать multi_match и выполнять поиск на разных анализаторах, потому что я не уверен, что phrase_search на граничной диаграмме имеет большой смысл.

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