如何在Solr中搜索短语?

时间:2017-09-28 12:43:58

标签: solr solrnet

我正在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*

我这样搜索:

*

在“测试分裂”之前,“测试”仍然存在:(

2 个答案:

答案 0 :(得分:0)

你解决这个问题的想法其实是正确的。有多种方法可以做到这一点。可以通过提升span queries在查询时解决此问题,但在索引时也更有效率。

经常为名字搜索做的事情是提高短语。您可以在exact fieldType中添加过滤器。使用Shingle Filter结帐shingles,默认minShingleSize2。带状疱疹是象征性的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

[2] https://lucene.apache.org/solr/guide/6_6/the-dismax-query-parser.html#TheDisMaxQueryParser-Thepf_PhraseFields_Parameter