不考虑Solr Analyzer PatternReplaceCharFilterFactory。 (可能是ngram或多值的原因)

时间:2014-07-08 17:44:19

标签: regex solr

这是我的问题。

我必须规范化地址数据以去除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)”,

我不确定这是否是一个可能与多值字段相关的错误,如果我做错了。

有人有想法吗?

2 个答案:

答案 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>