Я ищу индекс elasticsearch, содержащий человеческие имена и адреса. Рейтинг релевантности хорош, но не так хорош, как должен быть. К тому же он слишком медленный.
Наш индекс включает комбинацию анализаторов ngram и edge_ngram. Наши запросы представляют собой логические запросы, включая строку запроса и запросы с несколькими совпадениями.
Графики позволяют нам искать ошибочно написанные имена быстрее, чем при нечетком поиске.
Границы границ позволяют нам назначать более высокие оценка терминов, которые появляются в документе в том же порядке. Я думаю, что это работает только тогда, когда термины написаны точно так, как они появляются в указателе.
Мы переопределили модуль подобия по умолчанию, чтобы эффективно отключить TFIDF, поскольку это в основном не имеет отношения к поиску имен, то есть собственных существительных.
Как мы можем еще больше улучшить эти настройки индекса и структуру запроса, чтобы улучшить ранжирование релевантности?
В частности, одна проблема, с которой мы сталкиваемся с этой настройкой, заключается в том, что elasticsearch нежелательно увеличивает оценку документов, в которых поисковый запрос появляется несколько раз. Например, поиск по запросу «Салли Смит» присваивает более высокий балл Sandy Smith who lives at 10 Smith Rd
, чем Sally Smith who lives at 10 Plumb Rd
. Конечно, когда пользователь выполняет поиск «Салли Смит», он хочет видеть людей с именем «Салли Смит» в верхней части списка результатов.
Другой важный аспект здесь заключается в важности релевантности слова. Например, поиск Allan Joseph
должен дать более высокий балл Allan M Joseph
, чем Joseph Allan
.
В общем, трудно найти передовые методы поиска человеческих имен в индексе elasticsearch. Я искал переполнение стека и форумы elasticsearch. Было бы полезно, если бы вы знали, как исправить эти настройки индекса, сопоставление и / или запрос, чтобы улучшить ранжирование релевантности для человеческих имен и адресов, или если вы можете указать мне на лучшую информацию и примеры, чем я смог найти здесь, в стеке overflow и форумы elasticsearch.
Я вставляю наши настройки индекса, пример запроса и набор результатов ниже ...
Наши настройки индекса и сопоставления
{
"mappings": {
"properties": {
"firstname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
},
"ngram_analyzer": {
"type": "text",
"analyzer": "ngram_analyzer",
"index_options": "docs"
}
}
},
"fullname": {
"type": "text",
"fields": {
"edge_ngram_analyzer": {
"type": "text",
"analyzer": "edge_ngram_analyzer"
},
"keyword": {
"type": "keyword"
},
"ngram_analyzer": {
"type": "text",
"analyzer": "ngram_analyzer",
"index_options": "docs"
}
}
},
"home_address1": {
"type": "text",
"fields": {
"edge_ngram_analyzer": {
"type": "text",
"analyzer": "edge_ngram_analyzer",
"index_options": "docs"
},
"keyword": {
"type": "keyword"
},
"ngram_analyzer": {
"type": "text",
"analyzer": "ngram_analyzer",
"index_options": "docs"
}
}
},
"home_city": {
"type": "text",
"fields": {
"edge_ngram_analyzer": {
"type": "text",
"analyzer": "edge_ngram_analyzer",
"index_options": "docs"
},
"keyword": {
"type": "keyword"
},
"ngram_analyzer": {
"type": "text",
"analyzer": "ngram_analyzer",
"index_options": "docs"
}
}
},
"home_state": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
},
"ngram_analyzer": {
"type": "text",
"analyzer": "ngram_analyzer",
"index_options": "docs"
}
}
},
"home_zip": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
},
"ngram_analyzer": {
"type": "text",
"analyzer": "ngram_analyzer"
}
}
},
"lastname": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
},
"ngram_analyzer": {
"type": "text",
"analyzer": "ngram_analyzer",
"index_options": "docs"
}
}
},
"middlename": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"settings": {
"index": {
"max_ngram_diff": "20",
"number_of_shards": "1",
"similarity": {
"default": {
"type": "scripted",
"script": {
"source": "return doc.freq > 0 ? 1 : 0;"
}
}
},
"analysis": {
"analyzer": {
"edge_ngram_analyzer": {
"filter": [
"lowercase"
],
"type": "custom",
"tokenizer": "edge_ngram_tokenizer"
},
"ngram_analyzer": {
"filter": [
"lowercase"
],
"type": "custom",
"tokenizer": "ngram_tokenizer"
}
},
"tokenizer": {
"edge_ngram_tokenizer": {
"token_chars": [
"letter",
"digit",
"custom",
"whitespace"
],
"custom_token_chars": "'-",
"min_gram": "1",
"type": "edge_ngram",
"max_gram": "20"
},
"ngram_tokenizer": {
"token_chars": [
"letter",
"digit",
"custom"
],
"custom_token_chars": "'-",
"min_gram": "2",
"type": "ngram",
"max_gram": "5"
}
}
},
"number_of_replicas": "1"
}
}
}
Пример запроса ...
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "chris cl",
"fields": [
"fullname.ngram_analyzer^1.0",
"fullname.edge_ngram_analyzer^1.0",
"home_address1.edge_ngram_analyzer^1.0",
"home_address1.ngram_analyzer^1.0",
],
"type": "most_fields",
"default_operator": "or",
"boost": 1
}
}
],
"should": [
{
"multi_match": {
"query": "chris cl",
"fields": [
"fullname^1.0",
"home_address1^1.0",
],
"type": "most_fields",
"operator": "OR",
"boost": 1
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"_source": {
"includes": [
"fullname",
"firstname",
"lastname",
"home_address1",
"home_city"
]
}
Вот первые два результата этого запроса ...
"_id": "1",
"_score": 28.0,
"_source": {
"home_address1": "613 S Chris Ln",
"firstname": "Chris",
"home_city": "MOUNT PROSPECT",
"fullname": "Chris Huang",
"lastname": "Huang"
}
},
{
"_id": "2",
"_score": 22.0,
"_source": {
"home_address1": "719 W Truitt Ave",
"firstname": "Chris",
"home_city": "Chillicothe",
"fullname": "Chris Clark",
"lastname": "Clark"
}
}