我在 MongoDB 中建立了一个大型银行数据库。我可以轻松获取这些信息并在 whoosh 中使用它创建索引。例如,我希望能够匹配银行名称“密苏里鹰银行信托公司”和“密苏里鹰银行信托公司”。以下代码适用于简单的模糊,但无法实现上述匹配:
from whoosh.index import create_in
from whoosh.fields import *
schema = Schema(name=TEXT(stored=True))
ix = create_in("indexdir", schema)
writer = ix.writer()
test_items = [u"Eagle Bank and Trust Company of Missouri"]
writer.add_document(name=item)
writer.commit()
from whoosh.qparser import QueryParser
from whoosh.query import FuzzyTerm
with ix.searcher() as s:
qp = QueryParser("name", schema=ix.schema, termclass=FuzzyTerm)
q = qp.parse(u"Eagle Bank & Trust Co of Missouri")
results = s.search(q)
print results
给我:
<Top 0 Results for And([FuzzyTerm('name', u'eagle', boost=1.000000, minsimilarity=0.500000, prefixlength=1), FuzzyTerm('name', u'bank', boost=1.000000, minsimilarity=0.500000, prefixlength=1), FuzzyTerm('name', u'trust', boost=1.000000, minsimilarity=0.500000, prefixlength=1), FuzzyTerm('name', u'co', boost=1.000000, minsimilarity=0.500000, prefixlength=1), FuzzyTerm('name', u'missouri', boost=1.000000, minsimilarity=0.500000, prefixlength=1)]) runtime=0.00166392326355>
是否有可能通过 Whoosh 实现我想要的?如果不是,我还有哪些其他基于 python 的解决方案?
最佳答案
你可以使用嗖的模糊搜索匹配Co
与Company
但你不应该做因为Co
和Company
之间的差别是很大的。 Co
与 Company
相似,因为 Be
与 Beast
和 0x251812231340241 相似,搜索结果 31340241 和 1340241 之间的结果如何大,可以想象 31340241 15 的结果如何。
但是,如果您想将 ny
或 Company
或 Compan
匹配到 compani
,您可以通过使用个性化的类来做到这一点,默认值为 10x2132132132132132132132135135
class MyFuzzyTerm(FuzzyTerm):
def __init__(self, fieldname, text, boost=1.0, maxdist=2, prefixlength=1, constantscore=True):
super(MyFuzzyTerm, self).__init__(fieldname, text, boost, maxdist, prefixlength, constantscore)
然后:
qp = QueryParser("name", schema=ix.schema, termclass=MyFuzzyTerm)
您可以通过将
Companee
设置为 Company
来将 FuzzyTerm
与 maxdist
匹配,但是正如我所说,这会给出糟糕的搜索结果。我建议将 Co
从 Company
保留到 maxdist
。如果您正在寻找匹配的单词语言变体,最好使用
5
。注意: 较旧的 Whoosh 版本有
maxdist
而不是 1
。关于python - 在 Python 中使用 Whoosh 进行模糊字符串搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6709830/