2012-04-26 7 views
2

私は私のプロジェクトでコンパスベースのインデックスを使用しています。フィールド「名前」のための私のアノテーションベースの設定がされています。今の値を以下のコンパスクエリ/(スラッシュ)を含む

@SearchableProperty(name="name") 
@SearchableMetaData(name="ordering_name", index=Index.NOT_ANALYZED) 
private String name; 

「名前」フィールドに格納されている次のように

1. Temp 0 New n/a 
2. e/f search 
3. c/d search 

今差シナリオでの検索結果は次のとおりです。

1. 'c/d' -> +(+alias:TempClass +(c/d*)) +(alias:TempClass) -> 1 record found 
2. 'n/a' -> +(+alias:TempClass +(n/a*)) +(alias:TempClass) -> 0 record found 
3. 'search' -> +(+alias:TempClass +(search*)) +(alias:TempClass) -> 2 records found 

「n/a」を検索しようとすると、最初のレコードを値 'Temp 0 New n/a'で検索する必要があります。

ご協力いただければ幸いです!

+0

'(* n/a)'のところには '(n/a *)'があります。 –

+0

@Joop ... plz質問の更新を確認してください – Nirmal

+0

申し訳ありませんが、別の(あまりにも)野生の推測: "n/a"は値ではなく、 "not/available"と言っている部分のtoStringです。たぶん "/ a"を検索してみてください。 –

答えて

1

クエリ分析がドキュメント分析と一致しないことがあります。

あなたが内部で爆発させて、LuceneのStandardAnalyzerクエリの解析ではなく、インデックス時に使用しているほとんどの場合:

@SearchableMetaData(name="ordering_name", index=Index.NOT_ANALYZED)) 

このアナライザの内部で使用StandardTokenizer単語の境界として文字/を(のような考慮トークンはnaです。その後、トークンaStopFilterによって削除されます。

次のコードは、(入力が"c/d e/f n/a"である)この説明のための例です:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36); 
TokenStream tokenStream = analyzer.tokenStream("CONTENT", new StringReader("c/d e/f n/a")); 
CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class); 
PositionIncrementAttribute position = tokenStream.getAttribute(PositionIncrementAttribute.class); 
int pos = 0; 
while (tokenStream.incrementToken()) { 
    String termStr = term.toString(); 
    int incr = position.getPositionIncrement(); 
    if (incr == 0) { 
     System.out.print(" [" + termStr + "]"); 
    } else { 
     pos += incr; 
     System.out.println(" " + pos + ": [" + termStr +"]"); 
    } 
} 

ますよ次抽出したトークンを参照してください。

1: [c] 
2: [d] 
3: [e] 
4: [f] 
5: [n] 

お知らせその予想位置6:トークンaがありません。あなたが見ることができるように、LuceneのQueryParserもこのトークン化を実行します。

QueryParser parser = new QueryParser(Version.LUCENE_36, "content", new StandardAnalyzer(Version.LUCENE_36)); 
System.out.println(parser.parse("+n/a*")); 

出力は次のようになります。

+content:n 

EDIT:解決策を分析するためにWhitespaceAnalyzerを使用して、フィールドを設定することです。次のコードは、Luceneのコンセプトの証明です。

IndexWriter writer = new IndexWriter(new RAMDirectory(), new IndexWriterConfig(Version.LUCENE_36, new WhitespaceAnalyzer(Version.LUCENE_36))); 
Document doc = new Document(); 
doc.add(new Field("content","Temp 0 New n/a", Store.YES, Index.ANALYZED)); 
writer.addDocument(doc); 
writer.commit(); 
IndexReader reader = IndexReader.open(writer, true); 
IndexSearcher searcher = new IndexSearcher(reader); 
BooleanQuery query = new BooleanQuery(); 
QueryParser parser = new QueryParser(Version.LUCENE_36, "content", new WhitespaceAnalyzer(Version.LUCENE_36)); 
TopDocs docs = searcher.search(parser.parse("+n/a"), 10); 
System.out.println(docs.totalHits); 
writer.close(); 

出力は1です。

+0

今、StandardAnalyzerのために私のアプリで正確に何が起こっているのか理解しました。ストップワードを無効にする方法はありますか(私はストップワードリストから 'a'を削除する必要があります)?またはこの問題を解決する他の提案は非常に高く評価される.... – Nirmal

+0

私はちょうど答えを編集し、可能な解決策を与えた。私はそれが助けて欲しい! – jspboix

関連する問題