我有一个用户可以选择汽车零件的应用程序。他们挑选车辆,然后选择车辆属性作为方面。在他们选择了他们的车辆后,他们可以选择像发动机尺寸这样的方面,例如,缩小结果列表。问题是,并非所有文档都有引擎大小(在Solr中它是一个空值),因为它对所有部分都无关紧要。例如,发动机尺寸对于空气过滤器很少很重要。因此,即使用户选择了3.5L的发动机尺寸,我仍然希望在屏幕上显示空气过滤器作为用户可以选择的部分。 我做了一些搜索,以下的facet查询工作正常:
enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *])
此查询将匹配3.5或匹配记录,其中没有引擎大小字段的值(没有值意味着它无关紧要,它适合汽车)。完美...
问题:我最近将车辆属性字段设为多值字段,因此我可以将每个部分的属性存储为列表。然后我将切面应用于它,它工作正常。但是,当我应用上面提到的查询时出现了问题。虽然选择engineize facet将显示的文档数量缩小到仅具有该引擎大小的文档,但是没有出现具有用于engineize的空值(即“”)的记录(我还使用单词记录来表示文档)。上面的相同查询对于多值facet不起作用,就像engineize是单值字段时一样。
示例:
<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>
值,因此无法返回空气过滤器的第三个文档。我根本不想返回第二个文档,因为它与构面值
我基本上想要一个匹配给定facet的空字符串值的查询,并且还匹配实际值,所以我得到了两个文档。
有人的查询会返回文档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:"")
有没有人有一个适用于这两种情况的查询,我是否有空格作为空白值或根本没有值?
答案 0 :(得分:8)
如何更改索引的方式,而不是查询方式?
不要试图将“引擎大小无关紧要”作为空记录进行索引,而是将其索引为“ANY”。
然后你的查询变成了engineize:“3.5”OR(enginesize:ANY)
答案 1 :(得分:1)
我刚刚玩这个,发现hint似乎对我有用。翻译成您的查询应该是:
enginesize:"3.5" OR (-enginesize:["" TO *])
HTH,
ANDI
更新:经过一些更多的测试后,我认为这不可靠 - 对于某些索引,它必须是相反的方式而没有减号,即enginesize:[* TO ""]
。这可能取决于索引类型,如果它是多值的,甚至取决于实际值。
答案 2 :(得分:0)
我遇到了同样的问题,但在https://stackoverflow.com/a/35633038/13365中解决了它:
enginesize:"3.5" OR (*:* NOT enginesize:["" TO *])
-enginesize
解决方案对我没用。