我正在使用 Apache Solr 包含下面提到的Doc示例文档:
Doc 1 :(标签:头痛,姓名:B)当我查询“leg pain
”时......我正在回复所有文件。
如何获得完全匹配,即只有“腿部疼痛”匹配文档。 截至目前,我正在使用字段Type:String
我是否需要在架构文件中进行任何更改?
答案 0 :(得分:0)
这是因为当您搜索leg pain
Solr搜索leg
以及pain
作为不同的字词时,默认运算符(OR)。具有两个单词的文档将在结果中排名第一。
要获得完全匹配,请使用PhraseQuery。在这种情况下,使用双引号"leg pain"
solr搜索具有整个短语leg pain
的文档。
答案 1 :(得分:0)
对于完全匹配,您可以在solrconfig.xml中将查询解析器的mm(最小"应该"匹配)参数设置为100% 这指定了查询中必须匹配的最小子句数。 或者您可以在请求
中的查询时覆盖此参数(q.mm)答案 2 :(得分:0)
您正在寻找的是一种不同的相关机制,通过邻近来提升内容。使用eDismax,您正在寻找 pf 和 ps 参数,如相关性Solr Wiki中所述。例如,如果您要查询名为tags的字段,则查询将如下所示:
http://localhost:8983/solr/<YOUR_COLLECTION>/select?defType=edismax&q=head pain&pf=tags&ps=10
将根据您的评论中的要求返回结果。 特别是ps(Phrase Slop)参数:
设置查询中单词之间允许的其他单词数 短语。如果为零,那么这是一个精确的短语搜索。对于更大 这个值就像一个WITHIN或NEAR运算符。事实上,这是一个污点 编辑距离,其中单位对应于中的术语移动 查询短语不在位置。
答案 3 :(得分:0)
如果您使用的是SOLR verison 3
,则可以尝试以下字段类型
<fieldType name="input_general" class="solr.TextField">
<analyzer type="index">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9])" replacement="" replace="all" />
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
<analyzer type="query">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="([^a-zA-Z0-9])" replacement="" replace="all" />
<tokenizer class="solr.KeywordTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
将术语字段更改为:
<field name="Tags" type="input_general" indexed="true" stored="true"/>
因此,您将从输入本身中删除空格,它将返回您所需的内容:
Exact Match Search
;你可以尝试q =标签:“legpain”