我正在从 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 后出现问题。问题是某些未分析的文件的值是大写的。搜索过程如下所示:
- QueryParser 获取字段(文档对同一字段有很多价值,对用户来说是最重要的信息)和关键字
- 准备了具有附加用户条件的过滤器 QueryWrapperFilter(TermQuery(...))
- 我从 org.apache.lucene.search.Filter 覆盖 getDocIdSet 并遍历所有准备好的过滤器调用 filter.getDocIdSet(IndexReader) 并收集过滤后的元素。
我找到了这个关于区分大小写的答案。我知道在 lucene 2.4 中使用了 LowerCaseFilter 我所做的是我用 4.x 重新构建了索引,但是所有 NOT_ANALYZED 值现在都是小写的。然后问题就消失了。
对于我使用 3.0.3 区分大小写“无关紧要”而在 4.x 中“重要”的解决方案,这可能是什么原因。也许你们中的一些人可以向我解释幕后发生的事情。