1

这一直让我困惑,我似乎无法在任何地方找到合适的解释。

如果我运行使用 Query API 构建的查询,它运行得非常好。

TermQuery sourceQuery = new TermQuery(new Term("source", "CNN"));

运行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);

并输入命令行查询

source:CNN

我没有得到任何结果。在Luke 上运行这个命令确实给了我一个结果。有谁知道发生了什么?

4

1 回答 1

5

您可能为 QueryParser 对象使用了错误的分析器。注意:

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

我猜当您索引文本时,您的术语是大写的(或变成大写的)。这就解释了为什么方法 1 和 3 有效,但方法 2 无效,因为案例不匹配。一般来说,在索引和搜索时使用相同的 Analyzer是一个好主意,或者至少要注意大小写。

于 2012-04-05T18:14:12.013 回答