【问题标题】:Solr query conundrumSolr 查询难题
【发布时间】:2015-10-02 08:14:05
【问题描述】:

我最近从使用 Lucene for Sitecore 换成了 Solr。

在大多数情况下它一直很顺利,但我编写一些查询(使用 Sitecore.ContentSearch.Linq)抽象的方式现在似乎不兼容。

具体来说,我有“全球”内容和“区域”内容的情况,如下所示:

  • 首页 (000)
    • X
    • Z
  • 地区 (ID: 111)
    • 区域 1 (ID: 221)
      • 一个
      • B
    • 区域 2 (ID: 222)
      • D

我的代码可以在 Lucene 上运行,但现在不能在 Solr 上运行。它应该找到所有“全球”和单个区域的内容,不包括所有其他区域的内容。例如,如果用户的当前区域是区域 1,我希望查询返回内容 X、Y、Z、A、B。

Sitecore 的 Item Crawler 为索引中的每个项目都有一个名为“_path”的字段,它是一个多值字符串字段的 ID,例如,区域 1 的 _path 字段值将是 [000, 111, 221]。

当我使用 Linq 抽象编写此代码时,结果如下所示,不返回结果。

-_path:(111) OR _path:(221)

但是 _path:(111) 确实返回结果。 大吃一惊

当我使用 Solr 接口并将 OR 的每一侧包装在额外的括号中时,如下所示(我认为这是多余的),它可以工作! 脑洞大开的 v2

(-_path:(111)) OR (_path:(221))

首先,这些查询之间有什么区别?

其次,我真正的问题是我无法添加这些额外的括号,因为我在抽象 Linq 中工作,因此括号将被“优化”出来。

任何建议都会很棒!干杯。

【问题讨论】:

  • 你能贴出你用来生成查询的代码吗?

标签: linq solr lucene sitecore sitecore8


【解决方案1】:

这里的问题是,lucene 的否定查询不像你想象的那样工作。他们从已找到的内容中删除结果。 -_path:111 没有找到所有不在 111 中的文档,它没有找到任何东西。它只会删除结果。因此,您正在查找路径“221”的所有结果,然后删除任何也具有路径“111”的结果,我认为从您的层次结构中,这就是所有结果。 See my answer here for a bit more on that topic.

OR 让它看起来应该可以工作,但实际上-_path:(111) OR _path:(221)-_path:(111) _path:(221) 相同。这里的寓意是:Don't use Lucene's AND/OR/NOT syntax,如果你能帮忙的话。使用 +/-。 +/- 语法实际上表达了查询的操作方式,AND/OR/NOT 没有。它试图将其硬塞进一个不同的、类似 SQL 的检索模型中,并导致一些像这样的意外行为。

那么,(-_path:(111)) OR (_path:(221))

首先,它真的有效吗?还是只是得到一些结果?

    1234563 ,相当于_path:221
  • 如果它确实得到了您期望的结果(我猜它可能会): 某些东西正在将您的查询翻译成类似:(*:* -_path:111) (_path:221)。 Solr 在这些方面确实有一些逻辑,尽管在这种情况下我不太确定。从本质上讲,它会在它找到的任何孤立的否定查询前面放置一个全匹配,允许它们做你期望的事情。如果隐含的*:* 让您对性能感到紧张,那么它应该。但是 lucene 是一个倒排索引,它可以很好地快速找到一个术语的匹配项。获取所有不匹配的内容违背了该检索模型的原则,并且几乎必须对索引进行全面扫描。

【讨论】:

  • 抱歉这么晚才回复。我想我明白你的意思,但我的程序员的大脑阻碍了我。最后,我添加了一个始终为真的表达式(即_path:(000))作为与-_path:(111) 的AND,因此最终查询变为:(-_path:111 AND _path:000) OR _path:221,它返回了我需要的内容。仍然没有解释为什么在过渡到 Solr 后这会成为一个问题。
  • 在我将其标记为正确之前,我会尝试进行更多挖掘以证明您的答案。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 2012-05-18
相关资源
最近更新 更多