我如何在多价值的刻面字段中以及同时在Solr中搜索空白面?
-
20-09-2019 - |
题
我有一个应用程序,用户可以选择汽车零件。他们选择车辆,然后选择车辆属性作为面。选择车辆后,他们可以选择诸如发动机尺寸之类的面,以缩小结果列表。问题是,并非所有文档都有引擎尺寸(在Solr中是空值),因为这对所有零件都不重要。例如,发动机尺寸对于空气过滤器很少很重要。因此,即使用户为发动机尺寸选择了3.5L,我仍然想在屏幕上显示空气过滤器,以便用户可以选择的部分。我进行了一些搜索,以下方面查询效果很好:
enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *])
该查询要么匹配3.5,要么将其匹配的记录在没有发动机尺寸字段的值的情况下(没有值意味着无关紧要,并且适合汽车)。完美的...
问题: :我最近制作了车辆属性字段多值字段,因此我可以将每个零件的属性存储为列表。然后,我将其应用于它,并且效果很好。但是,当我应用上面提到的查询时,问题出现了。在选择引擎化的同时,缩小了仅显示具有发动机大小的文档显示的文档数量,但记录(我还使用单词记录是指含义文档),其中具有空的值(即“”)用于发动机化的文档。上面的同一查询对多相位的方面不起作用,就像引言是单个价值字段时相同的方式。
例子:
<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。第一个文档(发动机安装座)匹配,因为它包含我正在寻找的多值字段中的一个“发动机化”中的值(其中一个字段中包含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:"")
是否有人有一个可用于任何一种情况的查询,无论我有空间作为空白值还是根本没有值?
解决方案
如何更改索引方式,而不是查询方式?
与其试图将“发动机尺寸无关紧要”作为空记录索引,不如将其索引为“任何”。
然后,您的查询简单地变成了引擎化:“ 3.5”或(发动机:任何)
其他提示
我刚刚玩这个,找到了 暗示 这似乎对我有用。翻译成您的查询应该是:
enginesize:"3.5" OR (-enginesize:["" TO *])
hth,
和我
更新:经过进行进行了更多测试,我认为这不可靠 - 对于某些索引,它必须是相反的,没有负号,即 enginesize:[* TO ""]
. 。这可能取决于索引类型,如果是多价值甚至实际值。
无论如何,这似乎太多了。我可能决心用特殊标记代替空值...
我有同样的问题,但解决了 https://stackoverflow.com/a/35633038/13365:
enginesize:"3.5" OR (*:* NOT enginesize:["" TO *])
这 -enginesize
解决方案对我不起作用。