当精确匹配“#”(散列字符)时,Solr返回0行

时间:2011-10-27 11:50:26

标签: solr lucene

运行搜索时,例如:

field_name:#
field_name:"#"
field_name:"\#"

其中有一个值为“#”的记录,Solr返回0行。

我们必须使用的解决方法是使用范围查询  字段如:

field_name:[# TO #]

并返回正确的文档。

用例详细信息:  我们有一个字段索引文本字段并计算“字母”  group“。这只保留一个值中的第一个重要字符  (数字或字母),如果是数字,只需将“#”存储为我们  希望所有编号的项目组合在一起。

我也知道我们也可以通过使用特定的数字来解决这个问题  然而,不过哈希字符,我虽然提高了这一点  如果有更广泛的问题。我在下面列出了一些具体细节。

字段定义:

<fieldType name="letterGrouping" class="solr.TextField" sortMissingLast="true" omitNorms="true">
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="^([a-zA-Z0-9]).*" group="1"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.TrimFilterFactory" />
<filter class="solr.PatternReplaceFilterFactory" pattern="([^a-z0-9])" replacement="" replace="all"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="([0-9])" replacement="#" replace="all" />
</analyzer>
</fieldType>

服务器信息:

 Solr Specification Version: 3.2.0
 Solr Implementation Version: 3.2.0 1129474 - rmuir - 2011-05-30 23:07:15
 Lucene Specification Version: 3.2.0
 Lucene Implementation Version: 3.2.0 1129474 - 2011-05-30 23:08:57

2 个答案:

答案 0 :(得分:0)

来自solr用户组邮件列表

2011年10月27日13:09,Erick Erickson写道:

  

查看您的管理/分析页面并将您的令牌放入   索引和查询时间。我认为你会看到的是#   由于第一个被查询时被剥离   PatternReplaceFilterFactory。

     

您可能希望将分析器拆分为索引时间和   查询 - 时间对并执行适当的替换以保持#在查询   时间。

实际上,问题是在查询时,查询也是通过相同的分析器运行的。当输入通过带有正则表达式的第一个PatternReplaceFilterFactory运行时:

([^a-z0-9])

它从查询中删除了哈希字符,因此完全删除了查询。

答案 1 :(得分:0)

问题是在索引和查询时都应用了fieldtype 我试图在查询类型中检查字段类型的#转换,它似乎返回空白。

但是,field_name:123会返回结果,因为123应该转换为#并且应该与索引值匹配。

或者只在索引时间内应用fieldType。