当前位置: 首页 > 知识库问答 >
问题:

Lucene:前缀查询不能与WhitespaceAnalyzer一起工作

弘涛
2023-03-14

我对Lucene的不同查询对象进行了一些试验,并试图理解为什么在使用WhitespaceAnaylzer进行索引时,前缀查询与任何文档都不匹配。考虑以下测试代码:

protected String[] ids = { "1", "2" };
protected String[] unindexed = { "Netherlands", "Italy" };
protected String[] unstored = { "Amsterdam has lots of bridges",
        "Venice has lots of canals" };
protected String[] text = { "Amsterdam", "Venice" };

@Test
public void testWhitespaceAnalyzerPrefixQuery() throws IOException, ParseException {
    File indexes = new File(
            "C:/LuceneInActionTutorial/indexes");

    FSDirectory dir = FSDirectory.open(indexes);

    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_9,
            new LimitTokenCountAnalyzer(new WhitespaceAnalyzer(
                    Version.LUCENE_4_9), Integer.MAX_VALUE));
    IndexWriter writer = new IndexWriter(dir, config);

    for (int i = 0; i < ids.length; i++) {
        Document doc = new Document();
        doc.add(new StringField("id", ids[i], Store.NO));
        doc.add(new StoredField("country", unindexed[i]));
        doc.add(new TextField("contents", unstored[i], Store.NO));
        doc.add(new Field("city", text[i], TextField.TYPE_STORED));
        writer.addDocument(doc);
    }
    writer.close();

    DirectoryReader dr = DirectoryReader.open(dir);
    IndexSearcher is = new IndexSearcher(dr);
    QueryParser queryParser = new QueryParser(Version.LUCENE_4_9,
            "contents", new WhitespaceAnalyzer(Version.LUCENE_4_9));
    queryParser.setLowercaseExpandedTerms(true);
    Query q = queryParser.parse("Ven*");
    assertTrue(q.getClass().getSimpleName().contains("PrefixQuery"));
    TopDocs hits = is.search(q, 10);
    assertEquals(1, hits.totalHits);
} 

如果我用StandardAnalyzer替换WhitespaceAnaylzer,测试就会通过。我使用Luke检查索引内容,但在索引过程中Lucene存储值的方式上找不到任何差异。谁能澄清一下出了什么问题吗?

共有1个答案

上官琦
2023-03-14

StandardAnalyzer索引时用小写文本。WhitespaceAnalyzer没有。索引中的术语WhitespaceAnalyzer是“威尼斯”。

查询解析器会将查询小写,因为您已经设置了setLowerCaseExpandedTerms(true)(这也是默认值,要禁用它,您需要显式地将其设置为false)。所以您的查询是“Ven*”,它与“Venice”不匹配。

 类似资料:
  • 我正在使用ApacheLucene5.0。0并在使用QueryParser时遇到问题。我试图创建一个查询,但得到一个ParseException。 以下是我的代码: 这是我得到的例外: 如果有帮助,我已经包含了以下jar文件: lucene-analyzers-common-5.0.0.jar lucene-core-5.0.0.jar lucene-queries-5.0.0.jar lucen

  • http://localhost:8983/solr/prashant1/spell?q=blakc&spellcheck=on&wt=json 结果 但我需要与select查询相同的结果,它不能从SOLR管理中工作。 有没有设置和步骤要做?

  • 我是GraphQL的新手。我使用express-graphql在REST API上为petSore模式生成graphql查询。我能够使用graphql查询获得get API的结果,但无法使用突变获得POST/PUT API的响应。)为了创建宠物,我使用突变, null

  • 根据它的Javadoc,将生成,其中的第一个值是subscribe和第一个next信号之间的经过时间。 以下测试不起作用 它将抛出异常: 我原以为经过的时间至少是1000ms,但结果只有11ms。

  • 问题内容: 我想写一些类似的东西: 这有效: 这有效: 像这样的作品: 但是我需要在Meeting_time上做一个大于查询的事情,所以我需要将它写为一个字符串,我认为呢? 但是,两个sql查询在一起都会产生以下错误: 我觉得我好近……我在这里想念什么? 问题答案: 当不清楚该列来自哪个表时,会出现此消息。这应该工作:

  • pom.xml版本信息: SpringFox-Swagger2:2.5.0 昂首阔步-核心:1.5.10 springfox-swagger-ui:2.6.1 Springboot:1.5.3 我有一个项目与swagger2和Springboot。 没有@Aspect的项目代码工作得很好。 正确的结果: 但是当我添加以下代码时,swagger-ui没有显示test-api-impl。 swagge