我正在Solr
Name
字段中搜索某个词组。我为Name
尝试了不同的配置,属于string
类型或任何自定义TextField
。
<fieldType name="string" class="solr.StrField" sortMissingLast="true"
docValues="true" />
<fieldType name="alphaOnlySort" class="solr.TextField"
sortMissingLast="true" omitNorms="true">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory" replace="all"
replacement="" pattern="([^a-z])"/>
</analyzer>
</fieldType>
我这样定义了Name
:
然后尝试像字符串:
此外,我尝试了不同的标记器和过滤器组合,但没有成功。
这就是我想要的:我有短语'test split',我有一些名称为'test'
,'test 124'
,'testblablabla'
和{的条目{1}}。
我发现'test split 124'
条目在我的示例中是第一个匹配,并且'test split'有很多低得多的排名 altought它有更多匹配的字母。
为什么???
我正在测试使用solr管理界面和我的q(查询)参数是:
'test'
编辑1:
我还尝试创建名为ExactName的copyField,它具有以下配置:
Name:*
test split*
我这样搜索:
*
在“测试分裂”之前,“测试”仍然存在:(
答案 0 :(得分:0)
你解决这个问题的想法其实是正确的。有多种方法可以做到这一点。可以通过提升span queries
在查询时解决此问题,但在索引时也更有效率。
经常为名字搜索做的事情是提高短语。您可以在exact
fieldType中添加过滤器。使用Shingle Filter结帐shingles
,默认minShingleSize
为2
。带状疱疹是象征性的n-gram。
您可以通过添加额外的copyField
以及Shingle Filter
来创建不带小写的fieldType。
然后提升领域是下一步。如果您使用eDisMax查询解析器,则可以使用bf
参数来提升字段:
答案 1 :(得分:0)
首先,你想要什么? 您想仅返回您的短语的结果吗?或者与其他类型的比赛相比增加更多短语匹配?
edismax(及其属性)可能是您的解决方案。 您可以使用mm参数(配置子句的最小匹配)和pf(增强短语匹配)。 [1]
如果你只想让短语匹配:“test split”查询应该可以解决问题。 不要使用*通配符查询,使用适当的分析来分割令牌,通配符查询通常效率很低。
[1] https://lucene.apache.org/solr/guide/6_6/the-extended-dismax-query-parser.html