【发布时间】:2017-05-14 19:07:56
【问题描述】:
我正在尝试使用 elasticsearch 使用 ngrams 进行名称搜索匹配,
我尝试实现的技术如下:
输入:需要与数据库匹配的名称。
输出:来自我的名称数据库的所有潜在名称匹配。
我尝试这样做的方式如下,我将名称拆分为长度为 3-5 的 ngram。
然后,我从数据库中收集与这些 ngram 匹配的所有名称。
然后我检查 ngram 并按反向频率对它们进行排序,
这意味着常见的 ngram 将获得最低分。
例如,如果我在像“my company inc”这样的公司名称上使用它,我会给“inc” ngram 打最低分,因为 inc 出现在很多公司名称中。
我计算分数的方法是:1/(计算我所有数据库中 ngram 的出现次数),这样我就会将“最强”的 ngram 作为出现最少的 ngram。
我在 python 脚本中实现了这一点,但我想利用弹性的力量为我做同样的事情,
我知道 ngram 标记器,但是有没有办法告诉他做我做的分数?
据我所知,当我现在进行匹配时,它将根据查询中的 ngram 与他在 db 中的单词中匹配的 ngram 的多少来对结果进行评分
这是我使用的映射:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 5,
"token_chars": ["letter", "digit"]
}
}
}
},
"mappings": {
"names": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256,
}
},
"analyzer": "my_analyzer"
},
"id": {
"type": "long"
}
}
}
}
}
这是我做的查询:
GET /names/_search
{
"query": {
"match" : { "name" : "my company inc"}
}
}
【问题讨论】:
标签: elasticsearch