为了账号安全,请及时绑定邮箱和手机立即绑定

Solr 短语搜索需要匹配部分单词

Solr 短语搜索需要匹配部分单词

PHP
桃花长相依 2021-06-29 13:57:00
使用 Solr 搜索英语和韩语文档,到目前为止韩语搜索工作正常。也需要扩展英语精确短语以匹配部分单词。我使用的 Solr 查询:content: "He go"与他去,他走了,他目标等不匹配。我试过这样但没有奏效content: "He go"*content: "He go*"当前字段架构<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">    <analyzer type="index">        <tokenizer class="solr.StandardTokenizerFactory"/>        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>        <filter class="solr.LowerCaseFilterFactory"/>    </analyzer>    <analyzer type="query">        <tokenizer class="solr.StandardTokenizerFactory"/>        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>        <filter class="solr.LowerCaseFilterFactory"/>        <filter class="solr.CJKBigramFilterFactory" han="false" hiragana="false" katakana="false" hangul="true" outputUnigrams="true" />    </analyzer></fieldType>所以我的输入和预期输出如下:输入:他去(带引号)输出:他去,他去,他目标(应该与包含这些词的文档匹配,可以是部分匹配)我怎样才能实现这个功能,任何建议都非常感谢。
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

如果你想按词的部分搜索,你需要申请,例如,N-Gram Tokenizer, <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>


例如。


在: "bicycle"


出去: "bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"


在这种情况下,您将能够按单词部分进行搜索。您需要为两个分析器应用 NGramTokenizerFactory:


<fieldType name="custome_field_type" class="solr.TextField" positionIncrementGap="100" multiValued="false">

    <analyzer type="index">

      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>

      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>

      <filter class="solr.LowerCaseFilterFactory"/>

    </analyzer>

    <analyzer type="query">

      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>

      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>

      <filter class="solr.LowerCaseFilterFactory"/>

    </analyzer>

  </fieldType>

如果您使用上述字段类型,那么在管理工具上的相同分析如下。

//img1.sycdn.imooc.com//60ded05000019d1518620754.jpg

您还可以尝试以下查询分析器。这一切都取决于您的要求。


<analyzer type="query">

  <tokenizer class="solr.KeywordTokenizerFactory"/>

</analyzer>

您可以修改或添加字段类型schema.xml并将其应用于您的字段。完成后重新启动服务器,重新索引数据。如果数据匹配,您可以使用 solr 管理工具验证您的字段的上述 fieldType。


我使用了以下字段类型并使用 solr 工具进行了分析。


这是字段类型:


    <fieldType name="custome_field_type" class="solr.TextField" positionIncrementGap="100" multiValued="false">

        <analyzer type="index">

          <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>

          <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>

          <filter class="solr.LowerCaseFilterFactory"/>

        </analyzer>

        <analyzer type="query">

          <tokenizer class="solr.KeywordTokenizerFactory"/>

          <filter class="solr.LowerCaseFilterFactory"/>

        </analyzer>

   </fieldType>

请从 solr 管理工具中找到相同的分析。

//img1.sycdn.imooc.com//60ded0640001abcb14590730.jpg

查看完整回答
反对 回复 2021-07-02
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

复杂的短语查询分析器支持词组内嵌通配符。在您的情况下,附加inOrder=true到参数将为您提供所需的行为。

您应该注意一些限制:

性能对与模式关联的唯一术语的数量很敏感。例如,搜索“a*”将为索引中以单个字母“a”开头的指示字段的所有术语形成一个大的 OR 子句(技术上是一个包含许多术语的 SpanOr)。将通配符限制为至少两个或最好三个字母作为前缀可能是谨慎的。允许非常短的前缀可能会导致返回许多低质量的文档。

请注意,它还支持前导通配符“*a”以及随之而来的性能影响。在索引时间分析中应用 ReversedWildcardFilterFactory 通常是一个好主意。


查看完整回答
反对 回复 2021-07-02
  • 2 回答
  • 0 关注
  • 294 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信