猿问

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

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

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


输入:他去(带引号)

输出:他去,他去,他目标(应该与包含这些词的文档匹配,可以是部分匹配)


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


桃花长相依
浏览 295回答 2
2回答

温温酱

如果你想按词的部分搜索,你需要申请,例如,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">&nbsp; &nbsp; <analyzer type="index">&nbsp; &nbsp; &nbsp; <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>&nbsp; &nbsp; &nbsp; <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>&nbsp; &nbsp; &nbsp; <filter class="solr.LowerCaseFilterFactory"/>&nbsp; &nbsp; </analyzer>&nbsp; &nbsp; <analyzer type="query">&nbsp; &nbsp; &nbsp; <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>&nbsp; &nbsp; &nbsp; <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>&nbsp; &nbsp; &nbsp; <filter class="solr.LowerCaseFilterFactory"/>&nbsp; &nbsp; </analyzer>&nbsp; </fieldType>如果您使用上述字段类型,那么在管理工具上的相同分析如下。您还可以尝试以下查询分析器。这一切都取决于您的要求。<analyzer type="query">&nbsp; <tokenizer class="solr.KeywordTokenizerFactory"/></analyzer>您可以修改或添加字段类型schema.xml并将其应用于您的字段。完成后重新启动服务器,重新索引数据。如果数据匹配,您可以使用 solr 管理工具验证您的字段的上述 fieldType。我使用了以下字段类型并使用 solr 工具进行了分析。这是字段类型:&nbsp; &nbsp; <fieldType name="custome_field_type" class="solr.TextField" positionIncrementGap="100" multiValued="false">&nbsp; &nbsp; &nbsp; &nbsp; <analyzer type="index">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <filter class="solr.LowerCaseFilterFactory"/>&nbsp; &nbsp; &nbsp; &nbsp; </analyzer>&nbsp; &nbsp; &nbsp; &nbsp; <analyzer type="query">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <tokenizer class="solr.KeywordTokenizerFactory"/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <filter class="solr.LowerCaseFilterFactory"/>&nbsp; &nbsp; &nbsp; &nbsp; </analyzer>&nbsp; &nbsp;</fieldType>请从 solr 管理工具中找到相同的分析。

繁星点点滴滴

在复杂的短语查询分析器支持词组内嵌通配符。在您的情况下,附加inOrder=true到参数将为您提供所需的行为。您应该注意一些限制:性能对与模式关联的唯一术语的数量很敏感。例如,搜索“a*”将为索引中以单个字母“a”开头的指示字段的所有术语形成一个大的 OR 子句(技术上是一个包含许多术语的 SpanOr)。将通配符限制为至少两个或最好三个字母作为前缀可能是谨慎的。允许非常短的前缀可能会导致返回许多低质量的文档。请注意,它还支持前导通配符“*a”以及随之而来的性能影响。在索引时间分析中应用 ReversedWildcardFilterFactory 通常是一个好主意。
随时随地看视频慕课网APP
我要回答