我尝试使用TermQuery
测试Lucene上的搜索。但是,似乎搜索仅在我使用WhitespaceAnalyzer
时有效。一旦切换到StandardAnalyzer
,测试就失败了。
以下是测试:
@Test
public void simpleTermSearch() throws Exception {
Directory testDirectory = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(LUCENE_36, new StandardAnalyzer(LUCENE_36));
IndexWriter indexWriter = new IndexWriter(testDirectory, config);
Document document = new Document();
document.add(new Field("id", "001", Store.YES, Field.Index.NOT_ANALYZED));
document.add(new Field("priority", "HIGH", Store.YES, Field.Index.ANALYZED));
document.add(new Field("assignee", "Genzer Hawker", Store.YES, Field.Index.ANALYZED));
indexWriter.updateDocument(new Term("id", "111"), document);
IndexSearcher indexSearcher = new IndexSearcher(IndexReader.open(indexWriter, true));
Term priority = new Term("priority", "HIGH");
TermQuery termQuery = new TermQuery(priority);
TopDocs topDocs = indexSearcher.search(termQuery, Integer.MAX_VALUE);
assertEquals(1, topDocs.scoreDocs.length);
}
让我感到困惑的是,价值观是如此简单,所以我认为无论我使用WhitespaceAnalyzer
还是StandardAnalyzer
都没有什么不同,但似乎我错过了一些东西。我使用lucene-core-3.6.0。
你能帮助我理解它是如何运作的吗?
谢谢
答案 0 :(得分:1)
您的问题是区分大小写。
StandardTokenizer
包含LowercaseFilter
。 WhitespaceAnalyzer
没有。因此,使用StandardTokenizer
您的优先级被索引为“高”,而它被WhitespaceAnalyzer
索引为“高”。
如果您的查询正在被分析(即使用QueryParser),这对您的查询不会有问题,但是不会对您的TermQuery
进行任何分析。尝试将您的查询更改为:
TermQuery termQuery = new TermQuery(new Term("priority", "high"));
要看到这一点。
答案 1 :(得分:0)
femtoRgon正确地指出了问题,他的解决方案是我使用的第一件事。然而,还有另一种方法,这是我的最终解决方案。因此,我为那些感兴趣的人添加了这个答案。
我的方法是使用QueryParser
创建Query
,而不是手动制作TermQuery
。
QueryParser
需要Analyzer
,因此您只需要为其提供与您用于索引的Analyzer
相同的内容。
@Test
public void simpleTermSearch() throws Exception {
Directory testDirectory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(LUCENE_36);
IndexWriterConfig config = new IndexWriterConfig(LUCENE_36, analyzer);
IndexWriter indexWriter = new IndexWriter(testDirectory, config);
Document document = new Document();
document.add(new Field("id", "001", Store.YES, Field.Index.NOT_ANALYZED));
document.add(new Field("priority", "HIGH", Store.YES, Field.Index.ANALYZED));
document.add(new Field("assignee", "Genzer Hawker", Store.YES, Field.Index.ANALYZED));
indexWriter.add(document);
//Term priority = new Term("priority", "HIGH");
//TermQuery termQuery = new TermQuery(priority);
Query query = new QueryParser(LUCENE_36, "priority", analyzer).parse("HIGH");
IndexSearcher indexSearcher = new IndexSearcher(IndexReader.open(indexWriter, true));
TopDocs topDocs = indexSearcher.search(query, Integer.MAX_VALUE);
assertEquals(1, topDocs.scoreDocs.length);
}