使用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>
因此,我的输入和预期输出如下:
输入:他走了(带引号)
输出:他走了,他走了,他的目标(应该与具有这些词的文档匹配,可以是部分匹配)
我如何实现此功能,任何建议将受到高度赞赏。
答案 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>
如果您使用上述字段类型,则在管理工具上进行的分析如下。
您也可以尝试以下查询分析器。这完全取决于您的要求。
<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管理员工具中找到相同的分析结果。
答案 1 :(得分:1)
Complex Phrase Query Parser支持短语中的内联通配符。在您的情况下,将inOrder=true
附加到参数将为您提供所需的行为。
您应该注意一些限制:
效果对唯一条件项的数量敏感 与模式相关联。例如,搜索“ a *”将形成 大型OR子句(从技术上讲是SpanOr包含许多术语) 索引中指示字段的术语以 单字母“ a”。最好将通配符限制为至少 两个或三个字母作为前缀。允许很短 前缀可能会导致返回许多低质量的文档。
注意,它也支持前导通配符“ * a” 从而影响性能。正在申请 ReversedWildcardFilterFactory在索引时间分析中通常是很好的 想法。