如何在Solr中定义field与fieldType以实现最优药品名称联想建议效果
解决方案
问题根因
你当前使用的text_general字段类型采用标准分词器,会将含特殊符号、空格的药品名称拆分为多个独立token,同时Fuzzy匹配未限制前缀匹配规则,导致输入ibup时优先匹配到所有首token为I的药品,而非前缀匹配的Ibuprofen。
步骤1:自定义联想专用字段类型
在managed-schema(或schema.xml)中新增专为suggester设计的字段类型:
<fieldType name="text_suggest" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <!-- 整个药品名作为单个token,不做拆分 --> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <!-- 生成前缀索引,最小2字符,最大长度覆盖最长药品名即可 --> <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="50"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
步骤2:新增联想专用字段并配置映射
新增专门用于联想的字段,同时将原有药品名字段值复制到该字段:
<field name="drugName_suggest" type="text_suggest" indexed="true" stored="true" multiValued="false"/> <copyField source="drugName" dest="drugName_suggest"/>
步骤3:调整Suggester配置
修改搜索组件配置,适配新的字段和规则,优先返回前缀匹配结果:
<searchComponent name="suggest" class="solr.SuggestComponent"> <lst name="suggester"> <str name="name">mySuggester</str> <str name="lookupImpl">FuzzyLookupFactory</str> <str name="storeDir">fuzzyDirectory</str> <str name="dictionaryImpl">DocumentDictionaryFactory</str> <!-- 替换为专用联想字段 --> <str name="field">drugName_suggest</str> <!-- 替换为专用字段类型 --> <str name="suggestAnalyzerFieldType">text_suggest</str> <!-- 强制前3个字符完全匹配,过滤无效I开头结果 --> <str name="fuzzyPrefixLength">3</str> <!-- 精确前缀匹配结果优先排序 --> <str name="exactMatchFirst">true</str> <str name="buildOnStartup">false</str> <str name="buildOnCommit">false</str> </lst> </searchComponent>
生效操作
配置修改完成后重启Solr,重新索引所有药品数据,主动触发一次suggester索引构建即可正常使用。
内容的提问来源于stack exchange,提问作者David Rozmajzl
相关产品推荐
相关产品推荐

