solr - 如何在多值构面字段中同时在 Solr 中搜索空白构面?

标签 solr faceted-search multivalue

我有一个应用程序,用户可以在其中挑选汽车零件。他们选择他们的车辆,然后选择车辆属性作为方面。选择车辆后,他们可以选择发动机尺寸等方面,以缩小结果列表的范围。问题是,并非所有文档都有引擎大小(它在 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。第一个文档(引擎安装)匹配,因为它包含我正在查找的多值字段“enginesize”之一中的值(其中一个字段中包含 3.5)。但是,由于 <str> 为空,空气过滤器的第三个文档没有返回。值。我根本不想返回第二个文档,因为它与构面值不匹配

我基本上想要一个查询来匹配给定方面的空字符串值并匹配实际值,所以我得到了两个文档。

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

我尝试了以下但没有成功(包括这个问题最顶部的那个):
// 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:"")

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

最佳答案

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

不要尝试将“引擎大小无关紧要”索引为空记录,而是将其索引为“任何”。

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

关于solr - 如何在多值构面字段中同时在 Solr 中搜索空白构面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250751/

相关文章:

search - 如何在 solr 的多值字段中添加不同的值

java - 使用apache solr进行特定列的数据搜索

sql - 如何使用 SQL Server 创建分面搜索

mysql - 除了创建关系表之外,还有没有更有效的方法来处理多值属性?

sql - 使用 SSIS 将多值数据库导入 SQL

Solr 复杂刻面

linux - 在 Tomcat 中更改时区

>0 文件的 solr 健康检查

java - 强制 Solr 在搜索期间不使用 _version_ 字段

java - 获取某个类别的文档数量