6

我有一个应用程序,用户可以在其中挑选汽车零件。他们选择他们的车辆,然后选择车辆属性作为方面。选择车辆后,他们可以选择发动机尺寸等方面,例如,缩小结果列表。问题是,并非所有文档都有引擎大小(在 Solr 中它是一个空值),因为它对所有部分都无关紧要。例如,发动机尺寸对于空气滤清器来说并不重要。因此,即使用户选择 3.5L 作为他们的发动机尺寸,我仍然想在屏幕上显示空气过滤器作为用户可以选择的可能部分。我做了一些搜索,以下方面查询完美运行:

enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 

此查询将匹配 3.5 或匹配引擎大小字段没有值的记录(没有值意味着它无关紧要,它适合汽车)。完美的...

问题:我最近将车辆属性字段设置为多值字段,因此我可以将每个部分的属性存储为一个列表。然后我对它应用了刻面,它工作得很好。但是,当我应用上面提到的查询时,问题就出现了。虽然选择引擎大小方面将显示的文档数量缩小到仅具有该引擎大小的文档,但引擎大小具有空值(即“”)的记录(我也使用单词记录来表示文档)没有出现。上面的相同查询不适用于多值方面,就像 enginesize 是单值字段时一样。

例子:

 <doc> 
  <str name="part">engine mount</str>
  <arr name="enginesize">
   <str/>
   <str/>
   <str>3.5</str>
   <str>3.5</str>
   <str>3.5</str>
   <str>3.5</str>
   <str>3.5</str>
  </arr>
 <doc>

<doc> 
  <str name="part">engine bolt</str>
  <arr name="enginesize">
   <str>6</str>
   <str>6</str>
   <str>6</str>
   <str>6</str>
   <str>6</str>
  </arr>
 <doc>

 <doc> 
  <str name="part">air filter</str>
  <arr name="enginesize">
   <str/>
   <str/>
   <str></str>
   <str></str>
   <str></str>
   <str></str>
   <str></str>
  </arr>
 <doc>

我正在寻找的是一个查询,当我对 3.5 的引擎大小进行分面搜索时,它将拉回上面的文档 1 和 3。第一个文档(引擎安装)匹配,因为它包含我正在寻找的一个多值字段“enginesize”中的值(其中一个字段包含 3.5)。<str>但是,由于空值,没有返回空气过滤器的第三个文档。我根本不想返回第二个文档,因为它与构面值不匹配

我基本上想要一个查询,该查询将匹配给定方面的空字符串值并匹配实际值,因此我得到了返回的两个文档。

是否有人查询会返回文档 1 和文档 3(发动机支架和空气滤清器),但不返回发动机螺栓文档?

我尝试了以下但没有成功(包括这个问题最顶部的那个):

// returns everything
enginesize:"3.5"    OR  (enginesize:[* TO *] )
// only returns document 1
enginesize:"3.5"    OR  (enginesize:["" TO ""] AND -enginesize:"3.5")
// only returns document 1
enginesize:"3.5" OR (enginesize:"")

我使用 CSV 文件导入了上面的数据,我设置了字段keepEmpty=true. 我尝试在生成 CSV 文件时手动在字段中插入一个空格(这会给你<str> </str>,而不是之前的 ,然后重试查询。这样做,我得到了以下结果:

// returns document 1
enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *])
// returns all documents
enginesize:"3.5"    OR  (enginesize:["" TO ""] AND -enginesize:"3.5")
// returns all documents
enginesize:"3.5" OR (enginesize:"")

是否有人有适用于任何一种情况的查询,无论我有一个空格作为空白值还是根本没有值?

4

3 回答 3

8

如何更改索引方式而不是查询方式?

与其尝试将“引擎大小无关紧要”索引为空记录,不如将其索引为“ANY”。

然后你的查询就变成了 enginesize:"3.5" OR (enginesize:ANY)

于 2010-02-19T19:14:30.163 回答
1

我一直在玩这个,发现一个似乎对我有用的提示。翻译成您的查询应该是:

enginesize:"3.5" OR (-enginesize:["" TO *])

h,

和我


更新:经过更多测试后,我认为这并不可靠 - 对于某些索引,它必须是相反的方式并且没有减号,即enginesize:[* TO ""]. 这可能取决于索引类型,如果它是多值的,甚至取决于实际值。

无论如何,这似乎太过分了。我可能会决定用特殊标记替换空值...

于 2010-03-02T16:49:10.260 回答
0

我有同样的问题,但在https://stackoverflow.com/a/35633038/13365中解决了它:

enginesize:"3.5" OR (*:* NOT enginesize:["" TO *])

-enginesize解决方案对我不起作用。

于 2016-02-26T07:49:17.263 回答