クエリ分析がドキュメント分析と一致しないことがあります。
あなたが内部で爆発させて、LuceneのStandardAnalyzerクエリの解析ではなく、インデックス時に使用しているほとんどの場合:
@SearchableMetaData(name="ordering_name", index=Index.NOT_ANALYZED))
このアナライザの内部で使用StandardTokenizer単語の境界として文字/
を(のような考慮トークンはn
とa
です。その後、トークンa
はStopFilterによって削除されます。
次のコードは、(入力が"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
です。
'(* n/a)'のところには '(n/a *)'があります。 –
@Joop ... plz質問の更新を確認してください – Nirmal
申し訳ありませんが、別の(あまりにも)野生の推測: "n/a"は値ではなく、 "not/available"と言っている部分のtoStringです。たぶん "/ a"を検索してみてください。 –