【发布时间】:2013-02-05 13:06:45
【问题描述】:
我正在从 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) 并收集过滤的元素。
我找到了this ansewer regarding case sensitivity。我知道LowerCaseFilter is used in lucene 2.4 我所做的是我用 4.x 重新构建了索引,但所有 NOT_ANALYZED 值现在都是小写的。然后问题就消失了。
对于我使用 3.0.3 区分大小写的解决方案“无关紧要”而在 4.x 中“重要”的解决方案可能是什么原因。也许你们中的一些人可以解释一下幕后发生的事情。
【问题讨论】:
-
我可能会误解,但听起来你说它以前不应该工作,现在它实际上没有,就像你所期望的那样。至于为什么它曾经在世界上起作用,你对你的过程的描述真的对我没有帮助。我不知道你想说你在用 QueryParser 做什么,但它肯定会在解析中应用小写过滤器,我不知道你在哪里处理未分析的字段。
-
我试图描述整个情况,但似乎我失败了。这个问题对我来说太奇怪了,我决定从头开始重复整个迁移。结果是:通过过滤更多没有区分大小写的问题。我现在不知道要写什么...我检查了我在上次迁移期间执行的所有步骤,一切都是一样的。也许某些旧版本的 *.class 或 *.jar 在服务器上。很难说。
标签: java lucene migration case-sensitive