1

使用 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>

所以我的输入和预期输出如下所示:

输入:他走了(带引号)
输出:他走了,他走了,他的目标(应该与具有这些词的文档匹配,可以是部分匹配)

我怎样才能实现这个功能,任何建议都非常感谢。

4

2 回答 2

1

如果要按单词的一部分进行搜索,则需要应用,例如,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>

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

solr管理工具分析

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

<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 管理工具中找到相同的分析。

Solr 分析页面

于 2019-05-23T04:20:45.883 回答
1

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

您应该注意一些限制:

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

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

于 2019-05-23T08:25:51.567 回答