Solr词组搜索需要匹配部分词

时间:2019-05-23 00:43:48

标签: php search solr lucene solr-schema

使用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 个答案:

答案 0 :(得分: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>

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

Analysis of the solr admin tool

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

<analyzer type="query">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>

您可以在schema.xml中修改或添加字段类型,并将其应用于您的字段。 完成重启服务器后,重新索引数据。如果数据使用solr admin工具匹配,则可以为您的字段验证上述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 Analysis Page

答案 1 :(得分:1)

Complex Phrase Query Parser支持短语中的内联通配符。在您的情况下,将inOrder=true附加到参数将为您提供所需的行为。

您应该注意一些限制:

  

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

     

注意,它也支持前导通配符“ * a”   从而影响性能。正在申请   ReversedWildcardFilterFactory在索引时间分析中通常是很好的   想法。