是否可以在SOLR中查询具有特殊字符的数字?
我有一个字段score
,可以有35.49%
,104.18%
等小数百分比。
我需要使用greater than
和less 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]
它不会返回任何结果。我做错了吗?
答案 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>