使用TermQuery的Lucene搜索仅适用于WhitespaceAnalyzer,但不适用于StandardAnalyzer

时间:2014-06-11 07:32:29

标签: java lucene

我尝试使用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。

你能帮助我理解它是如何运作的吗?

谢谢

2 个答案:

答案 0 :(得分:1)

您的问题是区分大小写。

StandardTokenizer包含LowercaseFilterWhitespaceAnalyzer没有。因此,使用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);
    }