Luceneインデックスとクエリデザインの質問-人の検索
-
06-07-2019 - |
質問
最近、Lucene(具体的にはLucene.Net)での作業を開始しましたが、いくつかのインデックスを正常に作成し、それらのいずれにも問題はありません。以前、Endecaで作業したことがありますが、Luceneは軽量で強力であり、はるかに低い学習曲線を持っていることがわかりました(主に簡潔なAPIが原因です)。
ただし、特定のインデックス/クエリの状況があり、頭を包み込むのに問題があります。私が持っているのは個人ディレクトリです。このアプリケーションでは、完全一致と近似一致の両方を返すことを目的として、人を検索できます。現在、インデックスで" FirstName"を連結しています。および" LastName" " FullName"という1つのフィールドに、2つの間にスペースを追加します。 FirstName:JonとLastName:SmithはFullName:Jon Smithを生成します。ミドルネームとサフィックスの可能性を予想していますが、現時点では重要ではありません。
名前でファジー検索と同等の処理を行いたいので、誰かが「John Smith」を検索します。それでも「Jon Smith」に戻ります。私はマルチサーチについて考えていましたが、彼の名前が実際に「Jon Del Carmen」だった場合、これはより複雑になります。または「ジョンポールデルカルメン」。ユーザーが姓または名の一部を線引きするために入力する内容には何もありません。
私が考えている唯一の考えは、連結された値のスペースを、破棄されない文字に置き換えることができるということです。インデックス用のドキュメントを作成したとき、およびクエリを解析したときにこれを行うと、1つの大きな単語として扱うことができますよね?これを行う別の方法は、単純な名前(「Jon Smith」)とより複雑な名前(「Jon Paul Del Carmen」)の両方で機能しますか?
どんなアドバイスも本当にありがたいです。事前に感謝します!
編集:追加の詳細が続きます。
Lukeでは、次のクエリを入力しました。
FullName:jonn smith~
次のように解析されています:
FullName:jonn CreatedOn:smith~0.5
説明付き:
BooleanQuery:boost=1.0000
clauses=2, maxClauses=1024
Clause 0: SHOULD
TermQuery:boost=1.0000
Term: field='FullName' text='jonn'
Cluase 1: SHOULD
FuzzyQuery: boost=1.0000
prefixLen=0, minSimilarity=0.5000
org.apache.lucene.search.FuzzyTermEnum: diff=-1.0000
FilteredTermEnum: Exception null
" CreatedOn"インデックス内の別のフィールドです。用語「jonn smith」を引用符で囲みましたが、代わりにフレーズクエリのように扱います。問題は、私が正しいことをしていないだけであると確信していますが、このすべてでとても環境に優しいので、その何かが本当に何なのかわかりません。
解決
私の問題は、インデックスの作成方法にありました。最終的には、FullNameをトークン化しないことを確認し、クエリは正しい結果を返し始めました。上記のExplainの結果は、私の側のID10Tエラーが原因であり、現在正しく返されています。