如何在Solr中同时搜索多值facet字段中的空白面?

Dan*_*Dan 6 solr multivalue faceted-search

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

enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 
Run Code Online (Sandbox Code Playgroud)

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

问题:我最近制作了车辆属性字段的多值字段,因此我可以将每个部分的属性存储为列表.然后我将切面应用于它,它工作正常.但是,当我应用上面提到的查询时出现了问题.虽然选择engineize facet缩小了显示的文档数量,但只显示了具有该引擎大小的文档,但是没有出现具有空值(即"")的记录(我也使用单词记录表示文档).上面的相同查询对于多值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>
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一个查询,当我对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:"")
Run Code Online (Sandbox Code Playgroud)

我使用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:"")
Run Code Online (Sandbox Code Playgroud)

有没有人有一个适用于这两种情况的查询,我是否有空格作为空白值或根本没有值?

Tho*_*ing 8

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

而不是尝试将"引擎大小无关紧要"作为空记录,将其索引为"ANY".

那么你的查询就变成了engineize:"3.5"OR(engineize:ANY)