首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Solr - EDisMax -匹配子短语精确

Solr - EDisMax -匹配子短语精确
EN

Stack Overflow用户
提问于 2016-05-24 08:57:38
回答 2查看 505关注 0票数 1

我正在查询一个简单的核心类别名称。

  • 牛仔裤
  • 紧身牛仔裤
  • 靴子裁剪牛仔裤
  • 鞋子
  • ..。

我通常使用EDisMax。我希望用户查询,例如:

蓝色紧身牛仔裤

只匹配确切的类别。因此,在上述情况下,只有以下几项应该匹配:

  • 紧身牛仔裤
  • 牛仔裤

我用的是Solr 5.3.1。我尝试将类别"name“字段实现为字符串类型,并使用以下参数进行查询:

代码语言:javascript
复制
"params": {
      "q": "SKINNY JEANS",
      "defType": "edismax",
      "indent": "true",
      "qf": "name",
      "pf": "name",
      "pf3": "name",
      "wt": "json",
      "pf2": "name",
      "lowercaseOperators": "true",
      "debugQuery": "true",
      "stopwords": "true",
      "_": "1464079436985"
    }

但只有牛仔裤才配得上。为了我的命,我不能让紧身牛仔裤相配。

我对Solr的分析器越来越熟悉了,我试着生成以下类型来解决这个问题:

代码语言:javascript
复制
fieldType name="text_phrase" class="solr.TextField" positionIncrementGap="100">

      <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>

      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.TrimFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>

    </fieldType>

例如,使用KeywordTokenizerFactory索引类别名称而不进行标记化,但是将查询与EDisMax的pf/pf 2/pf3字段结合使用,但这也不起作用。我不认为带状疱疹是一个解决方案,而且PositionFilterFactory似乎不受欢迎。

如何EDisMax查询大字符串以获得较小的子字符串?

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2016-05-25 08:23:39

pf/pf2/pf3参数只是为了重新排列结果的顺序而起作用。它们必须首先匹配查询。这意味着你不能用它们来放弃任何结果,仅仅是为了把最好的结果提升到顶端。如果希望首先删除结果,则需要使用其他方法(例如,mm参数)。不幸的是,这是一个很难解决的问题,因为Solr不知道什么是用户的意思,哪些字段对于特定的查询是“强制的”。其中一些已经在泰德·沙利文的系列文章中讨论过,特别是关于查询自动筛选的。

此外,在您的示例中,pf/pf2/pf3只是作为一个普通的字段名使用,没有权重。这意味着他们实际上并没有指明优先次序。您可能会想要使用这样的东西来代替:

代码语言:javascript
复制
  "pf":"name^10",
  "pf3":"name^3",
  "pf2":"name^2",

正确使用时,应该会看到调试中显示的短语(启用了debugQuery标志):

代码语言:javascript
复制
"+((name:blue) (name:skinny) (name:jeans)) ((name:\"blue skinny jeans\")^10.0) (((name:\"blue skinny\")^2.0) ((name:\"skinny jeans\")^2.0)) ((name:\"blue skinny jeans\")^3.0)"
票数 4
EN

Stack Overflow用户

发布于 2016-05-24 09:27:33

因为您的查询端正在标记输入值,所以任何查询都将被分解为单独的令牌,然后这些标记将与存储的值匹配。

在“瘦身牛仔裤”的情况下,这将作为索引(SKINNY JEANS)中的一个标记保存下来,而在搜索时,字符串会被分割成不同的标记--因此它试图匹配BLUESKINNYJEANS。这两个令牌都不匹配SKINNY JEANS (作为一个单一的大型令牌)。

Shingles可以工作(至少比当前的解决方案更好),因为这将以BLUE_SKINNYSKINNY_JEANS作为令牌结束,这取决于您的字段配置。请记住,所有这些情况都会导致JEANS SKINNY无法生成任何匹配。

我猜您可以通过查询中的板条工厂来解决这个问题,并在索引时插入适当的分隔符。该查询将以BLUESKINNYJEANSBLUE_SKINNYSKINNY_JEANS作为查询的值,而SKINNY_JEANS则是索引的值--这意味着您将得到一个匹配(默认分隔符为‘',因此插入板条因子作为查询链的最后一步应该更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37408786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档