Apache Solr - 查询具有特殊字符的数字

时间:2016-09-10 16:53:25

标签: solr lucene numeric solr4

是否可以在SOLR中查询具有特殊字符的数字?

我有一个字段score,可以有35.49%104.18%等小数百分比。

我需要使用greater thanless than运算符查询此字段。我尝试使用WordDelimiterFilterFactory并创建了一个新的自定义字段。

<fieldType name="alphaNumericSort" class="solr.TextField" sortMissingLast="false" omitNorms="true">
      <analyzer>
          <!-- KeywordTokenizer does no actual tokenizing, so the entire
               input string is preserved as a single token
            -->
          <tokenizer class="solr.KeywordTokenizerFactory"/>
          <!-- The LowerCase TokenFilter does what you expect, which can be
               when you want your sorting to be case insensitive
            -->
          <filter class="solr.WordDelimiterFilterFactory"
                  generateWordParts="1"
                  generateNumberParts="1"
                  catenateWords="0"
                  catenateNumbers="0"
                  catenateAll="0"
                  preserveOriginal="1"
                  types="lang/delim-types.txt" />
          <filter class="solr.LowerCaseFilterFactory" />
          <!-- The TrimFilter removes any leading or trailing whitespace -->
          <filter class="solr.TrimFilterFactory" />
          <!-- Left-pad numbers with zeroes -->
          <filter class="solr.PatternReplaceFilterFactory"
                  pattern="(\d+)" replacement="00000$1" replace="all"
                  />
          <!-- Left-trim zeroes to produce 6 digit numbers -->
          <filter class="solr.PatternReplaceFilterFactory"
                  pattern="0*([0-9]{6,})" replacement="$1" replace="all"
                  />
          <!-- Remove all but alphanumeric characters -->
          <filter class="solr.PatternReplaceFilterFactory"
                  pattern="([^a-z0-9])" replacement="" replace="all"
                  />
      </analyzer>
  </fieldType>

文件delim-types.txt的内容是

  

%=&gt; ALPHA

但是当我这样查询时,

- score:[* TO 100.00] 

它不会返回任何结果。我做错了吗?

1 个答案:

答案 0 :(得分:1)

首先 - 我避免命名字段分数,因为这也是Solr内部使用的字段名称,用于在执行搜索后引用文档的分数(在fl参数中或在sort

您现有的链试图通过将数字填充到完全相同的长度来进行文本字段/字段排序。正则表达式替换过滤器将删除任何不是数字的内容,因此3.3和3.30将被视为不同的数字。

实现这一点的更好方法是使用数字字段。如果您可以接受双字段的不准确性,则TrieDoubleField可能是最佳选择。

删除%可以in an update processor。使用RegexReplaceProcessor的东西可以工作(这些在solrconfig.xml中定义):

<updateRequestProcessorChain name="remove_percent">
    <processor class="solr.RegexReplaceProcessorFactory">
        <str name="fieldName">score_own</str>
        <str name="pattern">%</str>
        <str name="replacement"></str>
        <bool name="literalReplacement">true</bool>
    </processor>
    <processor class="solr.LogUpdateProcessorFactory" />
    <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

然后,您可以通过在更新请求URL中包含update.chain=remove_percent或通过使用参数配置requestHandler来引用此更新处理器,以使Solr自动调用它(请参阅Configuring a custom chain as a default on the Update Request Processors wiki page

<initParams path="/update/**">
    <lst name="defaults">
        <str name="update.chain">remove_percent</str>
    </lst>
</initParams>

或通过requestHandler的定义:

<requestHandler ... >
    <lst name="defaults">
        <str name="update.chain">remove_percent</str>
    </lst>
</requestHandler>