2017-08-30 9 views
1

Luceneを使用して検索機能を追加しようとしていますが、重要な空白を扱うインデックスを取得できないようです。私はLuceneの6.6.0を使用して、私はKeywordAnalyzerを理解して何からだLuceneを使用して空白を含む用語を検索する

RAMDirectory directory = new RAMDirectory(); 
KeywordAnalyzer analyzer = new KeywordAnalyzer(); 
IndexWriterConfig config = new IndexWriterConfig(analyzer); 
IndexWriter writer = new IndexWriter(directory, config); 
Document doc = new Document(); 
doc.add(new TextField("content", "Bill Evans", Field.Store.NO)); 
writer.addDocument(doc); 
writer.close(); 

IndexReader reader = DirectoryReader.open(directory); 
IndexSearcher searcher = new IndexSearcher(reader); 

QueryParser parser = new QueryParser("content", analyzer); 
parser.setSplitOnWhitespace(false); 
Query query = parser.parse("Bill E"); 

TopDocs docs = searcher.search(query, 1); 
assertTrue(docs.totalHits > 0); 

私が探しているものです:私は、次のテスト・ケースのセットアップを持っている

「トークン化」ストリーム全体を単一のトークンとしてこれは、郵便番号、ids、および一部の製品名などのデータに役立ちます。

しかし、私は空白を含む一致するドキュメントを取得できないようです。

これを解決する方法はありますか?長期的な値で検索するQueryParser試行によって生成あなたが検索しようとしているときBill Evans

TermQuery - -

答えて

1

あなたはインデックスは、あなたが単一のフィールドとその値を持つ単一の用語を持つ単一の文書を持ってBill Eとその言葉は明らかに索引には存在しないので、ヒット率はゼロです。

検索文字列を - Bill Evansに置き換えると結果が表示されます。

this questionすぎ

ファーストを参照してください、あなたはあなたのインデックス作成と検索の懸念を分離する必要があります。索引付けされているものだけを検索できます。検索時間にトークンを壊さずに全文を索引付けする場合、検索時の入力文字列が索引付きのものと異なる場合は、WildCardQueryFuzzyQueryPhraseQueryなどを生成する必要があります。 TermQueryは正確な用語の値を検索します。

私の提案は、トークンなしで(を実行すると)フルテキスト値を格納するだけでなく、SimpleAnalyzerのようなものを使用してスペース上に追加のトークンを生成することです。

のでSimpleAnalyzerと何かのように、コードの上

doc.add(new TextField("content", "Bill Evans", Field.Store.NO)); 
doc.add(new StringField("storedcontent", "Bill Evans", Field.Store.YES)); 

、あなたは今条項を持っています - bill & evans (だけでなく、保存されたフィールドとしてフルテキスト)とあなたが今、同じアナライザで検索した場合、あなたクエリは次のようになります - content:bill content:e &あなたは結果を得るでしょう。

すべてのすべて - システムは、あなたがそれをコード化している方法:)

を働いているので、あなたの要件は、最初に、インデックスとどのようなクエリのあなたがそのインデックスに実行したいしたいものと理解しています。

関連する問題