【问题标题】:Lucene Search not showing expected outputLucene Search 未显示预期输出
【发布时间】:2017-03-05 10:05:30
【问题描述】:

在 lucene 中建立索引时,我创建的文档如下:

 Document document = new Document();



      Field fileNameField = new Field("name",
         name,
         Field.Store.YES,Field.Index.ANALYZED);

      Field filePathField = new Field("code",
         code,
         Field.Store.YES,Field.Index.NOT_ANALYZED);


      document.add(fileNameField);
      document.add(filePathField);

我正在尝试在名称字段上进行搜索。 该名称包含国家/地区列表。

这是查询解析器:

 queryParser = new QueryParser(Version.LUCENE_36,
         "name",
         new StandardAnalyzer(Version.LUCENE_36));
 query = queryParser.parse(searchQuery);

当我将搜索文本作为“in”传递时,我希望得到匹配的结果,如印度、印度尼西亚等...... 但结果是空的。 它只是做完全匹配。 当我将整个单词传递给印度时,我得到的响应为零。

使匹配结果不准确的可能解决方案是什么。 例如。甚至“dia”一词也应该像印度等一样给出回应。

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    这里有多个问题。我假设,您正在使用StandardAnalyzer 进行索引。如果没有,请在 cmets 中纠正我。

    1. Lucene StandardAnalyzerStopFilter 与英文单词列表结合在一起。该列表肯定包含“在”中的麦芽汁。因此,当您仅查询“in”时,它甚至会在它到达索引之前被过滤掉。
    2. “in”一词不在索引中,因为StandardTokenizer不会在单词中拆分。您可以使用通配符搜索(“in*”)来匹配索引标记“india”,但这不适用于“dia”,因为在查询开始时不允许使用通配符。

    如果您想摆脱这两个问题,您可能需要使用NGramTokenizer。它不作用于停用词并将给定单词的所有 n-gram 索引为标记。阅读更多内容here

    【讨论】:

    • 嘿,谢谢斯文。如果我只想匹配像 ind,indi 这样的开头字符,而不是来自印度的 'dia'。哪个标记器会很好。
    • 当您想从头开始匹配时,您可以使用通配符进行搜索,例如ind*StandardTokenizer 对此很好。
    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2022-11-26
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多