Elasticsearch 低模糊分数
Elasticsearch low fuzzy score
我有一个包含大约 300,000 个姓名和地址的数据库。有很多拼写略有不同但地址相同的名称。
我一直在尝试将这些名称组合在一起。
这是我的数据示例。
POST /_bulk
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SREE SAI MAHILA PODUPU SANGHAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SREE ANJANEYA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SREE BANGARAMMA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SREE SAI MAHILA PODUPU SANGHAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI SAI MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI BANGARAMMA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI ANJANEYA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI RAMA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI PYDITHALLAMMA MAHIALA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI RAMA MAHILA PODUPU SANGHAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI PYDIMAMBA MAHILA PODUPU SANGAM KANNAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI PYDITHALAMMA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
当我尝试模糊匹配一个名字时,我得到的匹配分数很低。
这是我正在使用的查询示例:
GET test/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": {
"query": "SREE BANGARAMMA MAHILA PODUPU SANGAM",
"fuzziness": 2,
"operator": "and"
}
}
}
]
}
}
}
当我查询这个小样本集时,对于 SREE BANGARAMMA MAHILA PODUPU SANGAM
,我得到 1.1982819
的 max_score
和模糊匹配文档:SRI BANGARAMMA MAHILA PODUPU SANGAM
有一个 score
共 0.2869133
。这表示 23%
匹配。他们的第一个单词略有不同:SRI
vs SREE
.
SRI
和 SREE
在我的数据集中都出现了很多。这些可以等同于诸如 Sir
之类的标题。查询的最后一部分 MAHILA PODUPU SANGAM
也在我的数据集中重复了很多次。字符串中唯一的唯一实体是 BANGARAMMA
。
术语 Frequency/Inverse 文档频率是否会导致结果偏斜?
当我查询这个小样本集时,我确实得到了我想要的结果。
但是当我 运行 在我的主要 300,000 个数据集上进行同样的查询时,我只得到与文档 100% 匹配的结果,而模糊匹配没有出现。
我试过使用 boost
,但这似乎也没有产生我想要的结果。
我想知道这个问题是不是因为模糊匹配分数低。如果模糊匹配仅在样本集中的 12 个数据点中得分如此之低,那么与 300,000 个数据点相比,它的得分可能要低得多。我想知道如何在查询主数据集时显示模糊匹配。坦率地说,我不知道问题似乎是什么。有人能给我指出正确的方向吗?
样本集的结果如下所示:
"hits": {
"total": 2,
"max_score": 1.1982819,
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "AViGh5xU276qVT8pqAHz",
"_score": 1.1982819,
"_source": {
"name": "SREE BANGARAMMA MAHILA PODUPU SANGAM",
"address": "KSR PURAM",
"city": "VIZIANAGARAM"
}
},
{
"_index": "test",
"_type": "test",
"_id": "AViGh5xU276qVT8pqAH2",
"_score": 0.2869133,
"_source": {
"name": "SRI BANGARAMMA MAHILA PODUPU SANGAM",
"address": "KSR PURAM",
"city": "VIZIANAGARAM"
}
}
]
}
尝试以下查询
{
"query": {
"multi_match": {
"query": "SREE BANGARAMMA MAHILA PODUPU SANGAM",
'fuzziness': 2,
'prefix_length': 1
}
}
}
我不会依赖 tf-idf 和模糊查询来满足您的需求。模糊查询最大为 edit-distance 2。因此,"sri" 可能匹配 "sree",但不匹配 "shree"。
阅读 SimHash 算法(字符串的 locality-sensitive 哈希函数 :: 意思是相似的字符串具有接近 one-another 的哈希值)。
如果在索引之前使用名称的 SimHash 将另一个字段添加到源数据,则可以使用该值来限制为给定地址返回的 "similar names" 的范围。
您可能仍然需要执行一些手动重复数据删除工作来使您的列表可靠,但至少 SimHashing 名称会使这个过程不那么痛苦(例如按地址排序,然后按 name-hash) .
您还可以决定使用停用词过滤器从搜索索引中删除像 "sri" 这样的敬语(如果它在您的 collection 中出现了 1000 次,它真的能帮助您找到人吗?或者有人单独搜索 "sri" 吗?)
我还建议使用一个共同的次大陆 nickname/name-variant 列表(如果你能找到一个)作为同义词列表来规范化(例如 Hari, Hariram => Hari)*
*如果你find/create这个列表,请分享它!许多项目都需要这个!
我有一个包含大约 300,000 个姓名和地址的数据库。有很多拼写略有不同但地址相同的名称。 我一直在尝试将这些名称组合在一起。 这是我的数据示例。
POST /_bulk
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SREE SAI MAHILA PODUPU SANGHAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SREE ANJANEYA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SREE BANGARAMMA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SREE SAI MAHILA PODUPU SANGHAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI SAI MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI BANGARAMMA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI ANJANEYA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI RAMA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI PYDITHALLAMMA MAHIALA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI RAMA MAHILA PODUPU SANGHAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI PYDIMAMBA MAHILA PODUPU SANGAM KANNAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
{ "index": { "_index": "test", "_type": "test" }}
{ "name":"SRI PYDITHALAMMA MAHILA PODUPU SANGAM", "address":"KSR PURAM", "city":"VIZIANAGARAM" }
当我尝试模糊匹配一个名字时,我得到的匹配分数很低。 这是我正在使用的查询示例:
GET test/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": {
"query": "SREE BANGARAMMA MAHILA PODUPU SANGAM",
"fuzziness": 2,
"operator": "and"
}
}
}
]
}
}
}
当我查询这个小样本集时,对于 SREE BANGARAMMA MAHILA PODUPU SANGAM
,我得到 1.1982819
的 max_score
和模糊匹配文档:SRI BANGARAMMA MAHILA PODUPU SANGAM
有一个 score
共 0.2869133
。这表示 23%
匹配。他们的第一个单词略有不同:SRI
vs SREE
.
SRI
和 SREE
在我的数据集中都出现了很多。这些可以等同于诸如 Sir
之类的标题。查询的最后一部分 MAHILA PODUPU SANGAM
也在我的数据集中重复了很多次。字符串中唯一的唯一实体是 BANGARAMMA
。
术语 Frequency/Inverse 文档频率是否会导致结果偏斜?
当我查询这个小样本集时,我确实得到了我想要的结果。 但是当我 运行 在我的主要 300,000 个数据集上进行同样的查询时,我只得到与文档 100% 匹配的结果,而模糊匹配没有出现。
我试过使用 boost
,但这似乎也没有产生我想要的结果。
我想知道这个问题是不是因为模糊匹配分数低。如果模糊匹配仅在样本集中的 12 个数据点中得分如此之低,那么与 300,000 个数据点相比,它的得分可能要低得多。我想知道如何在查询主数据集时显示模糊匹配。坦率地说,我不知道问题似乎是什么。有人能给我指出正确的方向吗?
样本集的结果如下所示:
"hits": {
"total": 2,
"max_score": 1.1982819,
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "AViGh5xU276qVT8pqAHz",
"_score": 1.1982819,
"_source": {
"name": "SREE BANGARAMMA MAHILA PODUPU SANGAM",
"address": "KSR PURAM",
"city": "VIZIANAGARAM"
}
},
{
"_index": "test",
"_type": "test",
"_id": "AViGh5xU276qVT8pqAH2",
"_score": 0.2869133,
"_source": {
"name": "SRI BANGARAMMA MAHILA PODUPU SANGAM",
"address": "KSR PURAM",
"city": "VIZIANAGARAM"
}
}
]
}
尝试以下查询
{
"query": {
"multi_match": {
"query": "SREE BANGARAMMA MAHILA PODUPU SANGAM",
'fuzziness': 2,
'prefix_length': 1
}
}
}
我不会依赖 tf-idf 和模糊查询来满足您的需求。模糊查询最大为 edit-distance 2。因此,"sri" 可能匹配 "sree",但不匹配 "shree"。
阅读 SimHash 算法(字符串的 locality-sensitive 哈希函数 :: 意思是相似的字符串具有接近 one-another 的哈希值)。
如果在索引之前使用名称的 SimHash 将另一个字段添加到源数据,则可以使用该值来限制为给定地址返回的 "similar names" 的范围。
您可能仍然需要执行一些手动重复数据删除工作来使您的列表可靠,但至少 SimHashing 名称会使这个过程不那么痛苦(例如按地址排序,然后按 name-hash) .
您还可以决定使用停用词过滤器从搜索索引中删除像 "sri" 这样的敬语(如果它在您的 collection 中出现了 1000 次,它真的能帮助您找到人吗?或者有人单独搜索 "sri" 吗?)
我还建议使用一个共同的次大陆 nickname/name-variant 列表(如果你能找到一个)作为同义词列表来规范化(例如 Hari, Hariram => Hari)*
*如果你find/create这个列表,请分享它!许多项目都需要这个!