Lucene 3.5.0 QueryParser在以编程方式生成的查询时没有找到任何结果

Mil*_*joo 1 java lucene

这最近令我感到困惑,我似乎无法在任何地方找到合适的解释.

如果我运行使用查询API构建的查询,它可以很好地工作.

TermQuery sourceQuery = new TermQuery(new Term("source", "CNN"));
Run Code Online (Sandbox Code Playgroud)

运行results = searcher.search(sourceQuery, 30)和检查results.totalHits显示值为159.

但是,在同一个程序中,我设置了一个QueryParser(我的默认字段被调用text):

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
QueryParser parser = new QueryParser(Version.LUCENE_35,
      "text", analyzer);
Run Code Online (Sandbox Code Playgroud)

并输入命令行查询

source:CNN
Run Code Online (Sandbox Code Playgroud)

没有结果.在Luke 运行此命令确实给了我一个结果.有谁知道发生了什么?

Kai*_*han 5

您可能使用了错误的Analyzer作为QueryParser对象.注意:

  1. 构建自己的Term对象时,术语的文本为大写.
  2. 您将StandardAnalyzer提供给QueryParser,因此术语的文本将转换为小写(通过StandardAnalyzer).
  3. Luke的默认分析器是KeywordAnalyzer,它保留了你指定术语的情况(即大写).

我猜你索引文本时你的术语是大写的(或者变成大写).这解释了为什么方法1和3工作,但2没有,因为案例不匹配.通常,在索引和搜索时使用相同的分析器是一个好主意,或者至少要注意这种情况.

  • 我认为一个澄清可能会对你有所帮助.查询时分析器给出您作为查询字符串输入的文本,Lucene从Analyzer喷出的标记中形成TermQueries.因此查询时分析器永远不会在索引中看到任何内容,它只会看到您的查询字符串.例如,如果您使用StandardAnalyzer分析了一个字段,那么在查询时使用KeywordAnalyzer是完全没问题的,只需要注意你给它的字符串 - 你必须给它一个StandardAnalyzer在索引时产生的确切标记. (2认同)