我有一个大约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
,我得到max_score
1.1982819
和模糊匹配文档:SRI BANGARAMMA MAHILA PODUPU SANGAM
有一个score
0.2869133
。这表示23%
匹配。他们的第一句话有点差异:SRI
vs SREE
。
我的数据集中SRI
和SREE
都显示了很多。这些可以等同于Sir
这样的标题。在我的数据集中,查询的最后一部分MAHILA PODUPU SANGAM
也会重复出现。字符串中唯一唯一的实体是BANGARAMMA
。
术语频率/反向文档频率是否会导致结果偏差?
当我查询这个小样本集时,我确实得到了我想要的结果。 但是当我在我的主要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"
}
}
]
}
答案 0 :(得分:2)
我不会依赖tf-idf和模糊查询来做你需要的事情。模糊查询最大编辑距离为2.因此," sri"可能会匹配" sree",但不会" shree"。
阅读SimHash算法(字符串的局部敏感哈希函数::意味着类似的字符串具有彼此接近的哈希值)。
如果在索引之前使用名称的SimHash向源数据添加另一个字段,则可以使用该值来约束类似名称的范围"返回给定地址。
您可能仍需要执行一些手动重复数据删除工作才能使列表稳固,但至少SimHashing名称会使此过程不那么痛苦(例如按地址排序,然后按名称哈希)。
你也可以决定简单地删除像#34; sri"来自使用停用词过滤器的搜索索引(如果它在您的收藏中发生了1000次,它是否真的帮助您找到人?或者是否有人搜索" sri"单独?)
我还建议使用一个共同的次大陆昵称/名称变体列表(如果你能找到一个)作为标准化的同义词列表(例如Hari,Hariram => Hari)*
*如果您找到/创建此列表,请分享!许多项目需要这个!
答案 1 :(得分:1)
尝试以下查询
{
"query": {
"multi_match": {
"query": "SREE BANGARAMMA MAHILA PODUPU SANGAM",
'fuzziness': 2,
'prefix_length': 1
}
}
}