Apache Solr 9+ 单字段的全文匹配与部分文本匹配配置
Apache Solr 9+ 实现文本字段的精确匹配与部分通配符匹配
针对你的需求,这里提供两种可行的Schema配置方案,分别适用于不同场景:
方案一:单字段同时支持两种匹配
通过配置包含NGram过滤器的字段类型,让字段同时索引完整文本和所有子串片段,既支持精确匹配完整地址,也支持通配符查询部分内容。
字段类型配置
在managed-schema(或schema.xml)中添加以下字段类型:
<fieldType name="text_address" class="solr.TextField"> <!-- 索引阶段:保留完整文本 + 生成所有子串ngram --> <analyzer type="index"> <tokenizer class="solr.KeywordTokenizerFactory"/> <!-- 不拆分文本,将整个地址作为一个词项 --> <filter class="solr.LowerCaseFilterFactory"/> <!-- 可选:开启大小写不敏感匹配,不需要则删除 --> <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="50"/> <!-- 生成2-50长度的子串,覆盖大部分查询场景 --> </analyzer> <!-- 查询阶段:保持与索引一致的处理逻辑 --> <analyzer type="query"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <!-- 和索引阶段对应,删除的话这里也要删 --> </analyzer> </fieldType>
字段配置
添加对应字段:
<field name="address" type="text_address" indexed="true" stored="true"/>
查询示例
- 精确匹配完整地址:
new SolrQuery("address:\"Westminster, London SW1A 0AA, UK\"") - 通配符匹配部分内容:
new SolrQuery("address:*SW1A 0AA*")
方案二:双字段拆分职责(推荐)
通过copyField将地址内容同步到两个字段,分别负责精确匹配和部分匹配,性能更优,逻辑更清晰。
字段类型配置
<!-- 精确匹配专用:存储原始文本,不做分词处理 --> <fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true"/> <!-- 部分匹配专用:索引所有子串ngram --> <fieldType name="text_partial" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <!-- 可选:大小写不敏感 --> <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="50"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
字段与复制配置
<!-- 主字段:存储原始地址,用于精确匹配 --> <field name="address" type="string" indexed="true" stored="true"/> <!-- 辅助字段:仅用于部分匹配查询,无需存储 --> <field name="address_partial" type="text_partial" indexed="true" stored="false"/> <!-- 自动将主字段内容同步到辅助字段 --> <copyField source="address" dest="address_partial"/>
查询示例
- 精确匹配完整地址:
new SolrQuery("address:\"Westminster, London SW1A 0AA, UK\"") - 通配符匹配部分内容:
new SolrQuery("address_partial:*SW1A 0AA*")
注意事项
- NGram参数调整:根据你的实际地址长度,调整
minGramSize和maxGramSize,避免生成过多短子串(影响性能)或遗漏长查询子串。 - 大小写敏感:如果需要严格区分大小写,删除所有
LowerCaseFilterFactory配置项。 - 性能考量:方案二的性能优于方案一,因为精确匹配无需处理大量ngram索引,适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者Tsvetoslav Tsvetkov
相关产品推荐
相关产品推荐

