0

我正在从 lucene 3.0.1 迁移到 4.1.0。经过几天的分析,我认为这些版本中查询结果的过滤有所不同。迁移后,我看到相同查询和过滤器的查询结果有所不同。

事情看起来如下:

我使用的是 lucene 3.0.1,但例如 IndexWriter 的 StandardAnalyzer 是这样配置的:

new StandardAnalyzer(Version.LUCENE_24)

QueryParser 使用了相同的配置。很少有字段是 NOT_ANALYSED(表示未编入索引;在 4.x 中已弃用),这会导致迁移到 4.0.0 或 4.1.0 后出现问题。问题是某些未分析的文件的值是大写的。搜索过程如下所示:

  1. QueryParser 获取字段(文档对同一字段有很多价值,对用户来说是最重要的信息)和关键字
  2. 准备了具有附加用户条件的过滤器 QueryWrapperFilter(TermQuery(...))
  3. 我从 org.apache.lucene.search.Filter 覆盖 getDocIdSet 并遍历所有准备好的过滤器调用 filter.getDocIdSet(IndexReader) 并收集过滤后的元素。

我找到了这个关于区分大小写的答案。我知道在 lucene 2.4 中使用了 LowerCaseFilter 我所做的是我用 4.x 重新构建了索引,但是所有 NOT_ANALYZED 值现在都是小写的。然后问题就消失了。

对于我使用 3.0.3 区分大小写“无关紧要”而在 4.x 中“重要”的解决方案,这可能是什么原因。也许你们中的一些人可以向我解释幕后发生的事情。

4

1 回答 1

0

索引和分析是两个不同的东西。

分析意味着该领域已通过Analyzer选择。不是分析的字段按原样放入索引中。

如果您索引一个大写字符串,而不进行分析,它将在索引中保持大写,并且不会使用小写查询找到。

于 2013-02-05T14:00:04.623 回答