2017-08-07 11 views
0

私はPython Whooshでファジー検索を実現したいと思いますが、私はそれを手に入れません。私はNGRAMWORDSの助けを借りてファジー検索を可能にしようとしました。それは結果がインデックスから取得されていない検索となると、残念ながらPythonによるあいまい検索Whoosh

writer.add_document(id=unicode(row["id"]), name=unicode(row["name"]), street=unicode(row["street"]), city=unicode(row["city"])) 

:インデックスは、次に述べる以下のように満たされている

schema = Schema(id=ID(stored=True), 
       name=NGRAMWORDS(minsize=2, maxsize=4, stored=True, queryor=True), 
       street=NGRAMWORDS(minsize=2, maxsize=4, stored=True, queryor=True), 
       city=NGRAMWORDS(minsize=2, maxsize=4, stored=True, queryor=False)) 

:ここ

は私のスキーマです

with self.index.searcher() as searcher: 
from whoosh.query import Term, Or, FuzzyTerm 
from whoosh.analysis import NgramWordAnalyzer 

ngramAnalyzer = NgramWordAnalyzer(minsize=2, maxsize=4) 
tokens = [token.text for token in ngramAnalyzer(unicode(name))] 
fetig = list() 
for t in tokens: 
tt = FuzzyTerm("name", unicode(t)) 
fetig.append(tt) 

myQuery = Or(fetig) 
res = searcher.search(myQuery, limit=10) 

"Ali"を検索するとヒットしません:

<Top 0 Results for Or([FuzzyTerm('name', u'al', boost=1.000000, maxdist=1, prefixlength=1), FuzzyTerm('name', u'ali', boost=1.000000, maxdist=1, prefixlength=1), FuzzyTerm('name', u'li', boost=1.000000, maxdist=1, prefixlength=1)]) runtime=0.000411987304688> 

答えて

0

これで解決済みです。問題は既に存在していたインデックスが既に開かれていなかったためです

index = open_dir("index", schema=self.schema) 

新しいものを作成しました。

はさらにクエリで妥当な結果を得るために用語代わりのFuzzyTermを使用することが重要だった:

ngramAnalyzer = NgramWordAnalyzer(minsize=3, maxsize=6) 
tokens = [token.text for token in ngramAnalyzer(unicode(name))] 
fetig = list() 
for t in tokens: 
    tt = Term("name", unicode(t)) 
    fetig.append(tt) 

myQuery = Or(fetig) 
res = searcher.search(myQuery, limit=10) 

をそして、あなたが見ることができるように私はNGRAMWORDSのMinSizeのに増加しています3の代わりに3 2

貴重な仕事、Matt Chaputに感謝します。

関連する問題