Solr - termfreq部分匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr - termfreq部分匹配相关的知识,希望对你有一定的参考价值。

我正在使用Solr来查询一组文档,我想获得某个术语的匹配数,现在我正在使用

termfreq(text,'manage')

然而,这并没有击中ManagerManagement

termfreq(text,'manage*')

返回相同的计数。我尝试过使用不同的标记器,有些甚至不接受*,但我没有找到一个返回正确匹配数的标记器。

领域:

<field name="text" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" required="false"/>

有没有办法我可以让termfreq也计算部分匹配?

答案

您需要向分析器添加一些自定义标记器和过滤器类。

在/shared/field_types.xml文件中,创建一个如下所示的新类型:

<fieldType name="text" class="solr.TextField" omitNorms="false">
    <analyzer>
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StandardFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

在/shared/fields.xml中:

<field name="text" stored="true" type="text" multiValued="false" indexed="true"/> 
<dynamicField name="*_text" stored="true" type="text" multiValued="false" indexed="true"/>

并将其用作“文本”作为字段的类型。

更高级的解决方案:

 <fieldType name="startsWith" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.KeywordTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <!-- remove words/chars we don't care about -->
      <filter class="solr.PatternReplaceFilterFactory" pattern="[^a-zA-Z0-9 ]" replacement="" replace="all"/>
      <!-- now remove any extra space we have, since spaces WILL influence matching -->
      <filter class="solr.PatternReplaceFilterFactory" pattern="s+" replacement=" " replace="all"/>
      <filter class="solr.TrimFilterFactory"/>
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.KeywordTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.PatternReplaceFilterFactory" pattern="[^a-zA-Z0-9 ]" replacement="" replace="all"/>
      <filter class="solr.PatternReplaceFilterFactory" pattern="s+" replacement=" " replace="all"/>
      <filter class="solr.TrimFilterFactory"/>
      <filter class="solr.ASCIIFoldingFilterFactory"/>
    </analyzer>
  </fieldType>

在/shared/fields.xml中:

<dynamicField name="*_starts_with" stored="true" type="startsWith" multiValued="false" indexed="true"/>

然后,在核心schema.xml的顶层添加:

<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="../../../shared/fields.xml"/>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="../../../shared/field_types.xml"/>

并将其添加到核心schema.xml中的copyFields:

 <copyFields>
      <copyField source="yourField" dest="yourField_text"/>
      <copyField source="yourField" dest="yourField_starts_with"/>
      ...
 </copyFields>
另一答案

我曾经也有过一样的问题。我需要计算termfreq,它也应该匹配单词的子部分。添加此FieldType解决了它。

<fieldType name="startWith" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

以上是关于Solr - termfreq部分匹配的主要内容,如果未能解决你的问题,请参考以下文章

Solr 部分和完整字符串匹配

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

solr 学习片段

SOLR 中的子字符串匹配

在 solr 3.4 中放置突出显示片段配置的位置

Solr 高亮是不是还可以指示返回的片段在原始字段中的位置或偏移量?