сопоставление ngram дает такую ​​же оценку менее значимым документам - PullRequest
1 голос
/ 09 мая 2020

Я ищу Боба Смита в своем индексе elasticsearch. Результаты Боб Смит и Бобби Смит вернулись в ответ с одинаковым счетом. Я хочу, чтобы у Боба Смита был более высокий балл, чтобы он появлялся первым в моем наборе результатов. Почему оценки равны?

Вот мой запрос

{
    "query": {
        "query_string": {
            "query": "Bob Smith",
            "fields": [
                "text_field"
            ]
        }
    }
} 

Ниже приведены настройки моего индекса. Я использую фильтр токенов ngram, описанный здесь: https://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch

{
    "contacts_5test": {
        "aliases": {},
        "mappings": {
            "properties": {
                "text_field": {
                    "type": "text",
                    "term_vector": "yes",
                    "analyzer": "ngram_filter_analyzer"
                }
            }
        },
        "settings": {
            "index": {
                "number_of_shards": "1",
                "provided_name": "contacts_5test",
                "creation_date": "1588987227997",
                "analysis": {
                    "filter": {
                        "ngram_filter": {
                            "type": "nGram",
                            "min_gram": "4",
                            "max_gram": "4"
                        }
                    },
                    "analyzer": {
                        "ngram_filter_analyzer": {
                            "filter": [
                                "lowercase",
                                "ngram_filter"
                            ],
                            "type": "custom",
                            "tokenizer": "standard"
                        }
                    }
                },
                "number_of_replicas": "1",
                "uuid": "HqOXu9bNRwCHSeK39WWlxw",
                "version": {
                    "created": "7060199"
                }
            }
        }
    }
}

Вот результаты моего запроса ...

"hits": [
  {
    "_index": "contacts_5test",
    "_type": "_doc",
    "_id": "1",
    "_score": 0.69795835,
    "_source": {
      "text_field": "Bob Smith"
    }
  },
  {
    "_index": "contacts_5test",
    "_type": "_doc",
    "_id": "2",
    "_score": 0.69795835,
    "_source": {
      "text_field": "Bobbi Smith"
    }
  }
]

Если я вместо этого поиск для Bobbi Smith, elasti c возвращает оба документа, но с более высоким баллом для Bobbi Smith. В этом больше смысла.

1 Ответ

1 голос
/ 09 мая 2020

Мне удалось воспроизвести вашу проблему, и причина этого связана с использованием вашего ngram_filter, который не создает токен для bob, поскольку минимальная длина токена должна быть 4, а стандартная tokenizer создал токен bob, но затем он отфильтровывается в вашем ngram_filter, где вы упомянули min_gram как 4.

Даже я пробовал с меньшей min_gram длиной до 3, что создало бы токены, но проблема в том, что и bob, и bobbie будут иметь одинаковые bob токены, следовательно, оценка для обоих из них будет одинаковым.

В то время как при поиске Bobbi Smith, тогда bobbi ie точный токен будет присутствовать только в одном документе, следовательно, вы получите более высокий балл.

Примечание. - Используйте API анализа и API объяснения для проверки сгенерированных токенов и их сопоставления. Это поможет вам понять проблему и мое объяснение в деталях, а также мои

...