2012-11-15 13 views
7

"bahnhofstrasse"を検索するとLuceneは "bahnhofstr"という用語を含む文書を探しています。検索用語がプレフィックスである用語を含む文書だけでなく、検索用語のプレフィックスである用語を含む文書も検索したいと考えています。検索用語の接頭辞であるインデックス内の用語を検索してください(または!)

どうすればよいですか?

+0

関連(しかし、あなたのための適切な答えずに、ただはい」と言います、あなたはできます "):http:// stackoverflow。com/questions/10671755/lucene-prefix-index-data-through-standard-analyzerを使用して検索 – Thilo

+1

その逆の部分は見られませんでした。だからあなたはまた "b"を打つことを望んでいますか?そこに最小の長さはありますか? – Thilo

+0

はい、「b」を打つこともできます。内容 "D"だけのフィールド "first_name"を想像してみてください... –

答えて

0

ファジークエリが最も役立つと思います。これは、あなたの質問からのLevenshteinの距離に基づいて用語を得点します。最小限の類似性が指定されていなければ、利用可能なすべての用語と効果的に一致します。これはパフォーマンスよりも少なくすることができますが、あなたが探しているものを達成します。

ファジークエリは等〜文字によってシグナリングされる:

firstname:bahnhofstr~ 

または最小類似度(0と1の間の数で、0は最小と最も緩いある)と

firstname:bahnhofstr~0.4 

または独自のクエリを作成している場合は、FuzzyQuery

これはまったく正確ではありませんが、近づける最も簡単な方法です。

あなたが探している限り、私はそれを達成するための簡単なLucene呼び出しを知らない。ところで、自分自身を

firstname:b 
firstname:ba 
firstname:bah 
firstname:bahn 
firstname:bahnh 
firstname:bahnho 
firstname:bahnhof 
firstname:bahnhofs 
firstname:bahnhofst 
firstname:bahnhofstr* 

私は実際にそれのためのクエリ文字列を生成しない:私はおそらくちょうどあなたのようなクエリ文字列何かで表すことができることを、termqueriesのシリーズに期間を分割します。私はTermQueryとPrefixQueryオブジェクトを自分で構築しています。

スコアリングは少しばらつきがありますが、より長い順序でクエリを実行するためには、より長いクエリを使用することをおすすめしますが、それはあなたが探しているものを正確に達成するための方法です。 DisjunctionMaxQueryは、このようなものを他の用語と併用し、より合理的な得点を得るのに役立ちます。

うまくいけば、あいまいなクエリはうまくいくはずです。はるかに良い解決策と思われる。あなたはこの種のクエリの必要性をたくさん持っている場合は、効果的な結果を達成するためにNGramPhraseQueryを使用できるようになるnグラム(NGramTokenizerを参照)、に、トークン化フィールドのインデックスを作成する際に

別のオプション、、、であるかもしれませんあなたは欲しい。

1

あなたが正しく理解していて、検索文字列が正確な文字列の場合、LuceneでqueryParser.setAllowLeadingWildcard(true);を設定すると、先読みワイルドカード検索が可能です(これは遅いかもしれませんが、 Luceneの文書が6万件以上の場合)。

あなたの例のクエリ構文のようなものになります:ちょうど

*bahnhofstr bahnhofstr* 

または可能性(これをテストしていませんが):

*bahnhofstr* 
関連する問題