【问题标题】:SOLR 6.6 eDisMax query not respecting mm parameterSOLR 6.6 eDisMax 查询不考虑 mm 参数
【发布时间】:2018-06-22 09:24:56
【问题描述】:

我使用的是 Solr 6.6.2,到目前为止,我们一直在使用 DisMax 查询以及 mm 参数,它的工作方式与预期一样。一个小例子

defType=dismax&q=samsung+iphone&qf=name+brand&mm=1 将按预期返回一个结果集,其中包含 iPhone 和三星产品。 然而当做完全相同的事情时,只需将defType 替换为defType=edismax(保留mm=1)没有返回结果。我已经在Apache SOLR reference 阅读了 eDisMax 查询解析器的文档,它清楚地表明 eDisMax 是一个扩展,所以我希望 mm 在 DisMax 和 eDisMax 中的行为相同,如果您在同一页面上向下滚动,文档还提供了 mm 参数的示例,该参数应该可以按我的预期工作。 这是一个错误,还是我错过了一些非常明显的东西?喜欢这里的帮助

编辑添加随请求一起发送的 solr 参数

eDisMax

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":0,
    "params":{
      "mm":"1",
      "q":"samsung iphone",
      "defType":"edismax",
      "indent":"on",
      "fl":"name, category_names, score",
      "fq":"channel:outbound",
      "wt":"json",
      "_":"1515855895772"}},
  "response":{"numFound":0,"start":0,"maxScore":0,"docs":[]
  }}

DisMax

{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":22,
    "params":{
      "mm":"1",
      "q":"samsung iphone",
      "defType":"dismax",
      "indent":"on",
      "fl":"name, category_names, score",
      "fq":"channel:outbound",
      "wt":"json",
      "_":"1515855895772"}},
  "response":{"numFound":2147,"start":0,"maxScore":12.172616,"docs":[
      {
        "name":"Apple iPhone 5s",
        "score":12.172616},...]
}}

【问题讨论】:

  • 这是您的实际查询吗? edismax 在q 字段中支持不同的语法——它直接支持Lucene 语法以及dismax 语法。
  • @MatsLindh 这是我的确切查询。我知道我可以在 q 参数中传递 Lucene 语法查询,这确实有效,例如:如果我执行 q=apple+OR+samsung 之类的操作,则结果与预期一致,即联合。但我希望 mm 参数能够像在 dismax 查询中那样工作,即使用 mm=1 时,解析器应该生成类似于 OR 的东西。
  • q.op 是否设置在任何地方? IE。在您的请求处理程序或类似的东西中?
  • @MatsLindh,没有。 :( 我可以编辑答案以提供所有传递的 solr 参数
  • @MatsLindh 在问题中添加了更多信息。希望它可以帮助您为我指明正确的方向。另外,我的 solr 是否需要一些“特殊”配置才能与 eDisMax 一起使用?由于它与 DisMax 的工作原理一样,因此我没有进行任何配置更改

标签: search solr lucene information-retrieval edismax


【解决方案1】:

不确定是否有其他人遇到过这个问题,但我觉得它没有得到很好的记录。 我们的 Solr q.op 默认为 AND,因此像 "foo bar car" 这样的搜索词被搜索为 foo AND bar AND cat。现在有了mm=2defType=dismax,查询被错误地解析为(foo AND bar AND cat)~2,到目前为止一切顺利..

当我更改defType=edismax 时,相同的查询"foo bar cat"mm=2 被解析为(foo AND bar AND cat) 注意: 缺少~2

现在,如果我继续添加q.op=OR,有趣的事情就会开始发生。解析后的查询现在看起来像 (foo bar cat)~2 这正是 dismax 所做的。所以你可以理解(foo bar cat)~2 找到我这些术语中的至少两个。如果我删除 mm 参数,解析后的查询看起来像 (foo bar cat) 并且由于 q.op=OR 它返回包含任何 3 个术语的任何文档。

无论哪种方式,这都无关紧要,并且可以实现相同的行为,只是令人困惑的是disMaxeDisMax 之间的行为有些不一致。

希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2013-09-06
    • 2022-01-15
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多