麻烦从Solr字母范围查询搜索字符串中省略标点符号

时间:2015-01-13 17:45:08

标签: sorting solr alphabetical range-query

我正在尝试使用范围查询创建名称(个人和机构)的字母浏览,这些查询将排序而不考虑标点符号或大小写,但即使Solr中的分析工具建议查询中的标点符号应该被正确删除,查询中存在标点符号仍会对结果产生负面影响。

来自schema.xml的

<fieldType name="sort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
  <analyzer>
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="-" replacement=" "/>
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[\p{Punct}¿¡「」]" replacement=""/>
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\s+" replacement=" "/>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.ICUFoldingFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.TrimFilterFactory" />
  </analyzer>
</fieldType>

<field name="authorSort" type="sort" indexed="true" stored="true" multiValued="false" required="true"/>
来自solrconfig.xml的

<requestHandler name="/authors" class="solr.SearchHandler">
<lst name="defaults">
  <str name="defType">lucene</str>
  <str name="echoParams">explicit</str>
  <str name="fl">*</str>
  <str name="df">authorSort</str>
  <str name="sort">authorSort asc</str>
  <str name="rows">20</str>
  <str name="wt">ruby</str>
  <str name="indent">true</str>
</lst>
</requestHandler>

我的实际查询如下:

http://myserver/solr/testCore/authors?q=["Search String" TO *]

当我搜索q=["ACA" TO *]时,我的最高成绩是“ACA(认证档案管理员学院)”,这很好。如果我改变“ACA”中使用的大小写,我的结果不会改变,这也是好的。如果我搜索句号(q=["A.C.A." TO *])的首字母缩略词,我根本得不到合适的结果,而我的热门歌曲是“A3(音乐组)”。在这种情况下,我怀疑它是在整理期间而不是放弃它。

根据Solr的分析工具,“ACA”和“A.C.A.”应使用我配置的分析仪将其渲染为“aca”。我无法解释为什么这两次搜索没有实际等效。

(如果它有任何区别,索引时间分析实际上没用,因为我的代码在提交要索引的数据之前进行相同的转换。有原因。所以它只是查询时间分析让我悲伤。)

编辑:这是我对“A.C.A.”的分析截图因为查询应该有效(根据Solr分析工具)。

Edit: Here's a screenshot of how my analysis of "A.C.A." as a query should be working (according to the Solr analysis tool).

  

大约四个月后添加:

     

自从发布问题而没有找到决议以来,我有   切换到使用自定义过滤器工厂进行分析。这给了   我控制本来很困难的分析   不可能给出提供的过滤器。我的第一次尝试也是一样的   问题 - 分析在常规搜索中有效但未应用于   范围查询。通过添加解决了此问题   implements MultiTermAwareComponent到我的过滤器工厂并覆盖   getMultiTermComponent()。我不知道这对一个领域有什么作用   这是使用KeywordTokenizer,因此永远不会有多个   字段值中的术语......但它确实解决了问题。这是为了    Solr 4.2

0 个答案:

没有答案