这是我的问题。
我必须规范化地址数据以去除th或st。 字符串示例:35 West 15th Street
我不能只使用同义词因为th / st是“word”15的一部分所以我需要使用 solr.PatternReplaceCharFilterFactory
这是我的架构条目:
<fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([0-9]{1,})(st |th |ST |TH )" replacement="$1 " />
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.NGramTokenizerFactory" minGramSize="1" maxGramSize="15" />
<!--filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
enablePositionIncrements="true"
/-->
<!--filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/-->
</analyzer>
<analyzer type="query">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([0-9]{1,})(st |th |ST |TH )" replacement="$1 " />
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<!--filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /-->
<!--filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/-->
</analyzer>
</fieldType>
<field name="building_search_text" type="text_ngram" indexed="true" stored="true" multiValued="true"/>
我的字段是多值的,因为我还包含了building_name和其他文本。
当我使用管理界面尝试时,PatternReplaceCharFilterFactory似乎正常工作 - &gt;分析。因为当我用“35 West 15th Street”进行测试时,我得到了这个结果
PRCF text 35 West 15 Street
用于查询和索引。
但是当我查询时我得到了这个输出: “building_search_text”:[ “25th West 15th Street,259 West 15th Street”, “西15街259号” ],
在查询时,它也无法按预期工作。 查询:item_type:Building AND building_search_text :(西15街35号)
以下是查询调试的输出:( th未被剥离) “debug”:{ “rawquerystring”:“item_type:Building AND building_search_text:(西15街35号)”, “querystring”:“item_type:Building AND building_search_text :(西15街35号)”, “parsedquery”:“+ item_type:Building +(building_search_text:35 building_search_text:west building_search_text:15th building_search_text:street)”, “parsedquery_toString”:“+ item_type:Building +(building_search_text:35 building_search_text:west building_search_text:15th building_search_text:street)”,
我不确定这是否是一个可能与多值字段相关的错误,如果我做错了。
有人有想法吗?答案 0 :(得分:1)
为什么不使用http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WordDelimiterFilterFactory(splitOnNumerics =&#34; 1&#34;)所以第22和第3街道名称也会分成数字和字母部分?
答案 1 :(得分:0)
这是对我自己问题的回应。
我使用了错误的标记器。
这是新的fieldType定义:
<fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="([0-9]{1,})(st|th)\s?" replacement="$1 " replace="all" />
<filter class="solr.NGramTokenizerFactory" minGramSize="1" maxGramSize="15" />
<!--filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" enablePositionIncrements="true" /-->
<!--filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/-->
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" pattern="([0-9]{1,})(st|th)\s?" replacement="$1 " replace="all" />
<!--filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /-->
<!--filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/-->
</analyzer>
</fieldType>