【问题标题】:lucene filter case sensitivelucene过滤器区分大小写
【发布时间】: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 后出现问题。问题是一些未分析的文件的值是大写的。搜索过程如下:

  1. QueryParser 获取字段(文档对同一字段有很多价值,对用户来说是最重要的信息)和关键字
  2. 准备了具有其他用户条件的过滤器 QueryWrapperFilter(TermQuery(...))
  3. 我从 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


【解决方案1】:

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

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

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

【讨论】:

  • 我同意,分析是在索引和解析查询期间完成的。但是当查询结果被过滤时会发生什么?过滤是否区分大小写?我没有看到过滤器和分析器之间有任何联系。
  • 您使用的过滤器,QueryWrapperFilter 使用的查询应该与普通查询完全一样,即在过滤非分析字段时,它会区分大小写,在分析字段上使用时,这取决于分析仪
猜你喜欢
  • 2013-08-07
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2013-10-24
  • 2016-03-15
  • 2018-07-10
  • 2022-12-02
  • 1970-01-01
相关资源
最近更新 更多