Улучшение запроса elasticsearch по именам и адресам людей - PullRequest
1 голос
/ 29 мая 2020

Я ищу индекс 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"
        }
    }
...