【问题标题】:How to search phrase in Solr?如何在 Solr 中搜索短语?
【发布时间】:2017-09-28 12:43:58
【问题描述】:

我在Name 字段的Solr 中搜索一些短语。我为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''test 124''testblablabla''test split 124' 的条目。 我发现'test' 条目在我的示例中是第一个匹配项,并且“测试拆分”的排名要低得多,尽管它有更多匹配的字母。 为什么会这样??

我正在使用 solr 管理界面进行测试,我的 q(查询)参数是: Name:*test split*

编辑 1:

我还尝试创建名为 ExactName 的具有以下配置的 copyField:

 <fieldType name="exact" class="solr.TextField">
    <analyzer>
     <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer> 
 </fieldType>

我这样搜索:

Name:*test split* OR (ExactName:*test split*)^5.0 

“测试”仍然出现在“测试拆分”之前:(

【问题讨论】:

  • 您是否尝试过为 (e)dismax 处理程序使用 pfpf2pf3 参数?创建这些是为了增强匹配序列。另请记住,通配符搜索将跳过分析链的大部分部分。
  • 那里写什么?我的字段名称“名称”。我试过了,但还是一无所获
  • 文档的排名与 lucence 评分功能有关,在 Solr 6 之前为tf-idf,在 Solr 6 之后为BM25Here is a good post comparing the two.

标签: solr solrnet


【解决方案1】:

首先,你想要什么? 你想只返回你的词组的结果吗?或者与其他类型的匹配相比,增加更多的词组匹配?

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

【讨论】:

  • +1 表示“通配符查询通常非常低效。”。仅提供大量实践经验。
【解决方案2】:

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

通常对名称搜索所做的确实是增加词组。您可以在exact 字段类型中添加过滤器。使用Shingle Filter 结帐shingles,默认为minShingleSize2。带状疱疹是令牌 n-gram。

您也可以通过添加额外的copyFieldShingle Filter 来创建不使用小写字母的字段类型。

然后提升字段是下一步。如果您使用 eDisMax 查询解析器,您可以使用 bf 参数来提升字段:

  • 区分大小写(没有小写字母)+ shingles 具有最高的提升
  • 不区分大小写(使用小写字母)+ 带第二高提升的带状疱疹
  • 没有增强的标准字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    相关资源
    最近更新 更多