Solr facet substring search

时间:2015-05-13 19:12:24

标签: solr substring prefix facet

想象一下,我有以下几个方面:

发言人:[Mike Thompson,Thomas Wilkinson,Sally Jeffers] 场地:[威尔托马斯医疗中心,BB& R医疗协会,KLR汤普森]

Solr似乎允许& facet.prefix = Thom,在那里我可以获得以“Thom”开头的方面,并且将返回“演讲者:Thomas Wilkinson”而不是其他人。

我怎样才能完成相同的& facet.substring = Thom,它将返回Mike Thompson和Weill Thomas ....

我试过& facet.query = Thom但这似乎根本不起作用。

由于

2 个答案:

答案 0 :(得分:0)

由于您没有提供完整的查询字符串,因此无法确定,但可能是facet未在facet结果中返回Weill Thomas,因为您只在查询中指定了facet.field = speaker,并且威尔托马斯实际上是在场地领域。您需要在搜索查询中使用第二个facet.field = venues参数来检索这些参数。

Facet前缀仅用于在搜索完成后过滤结果,因此不要将该参数用于搜索目的。请检查此问题:SOLR facet search by prefix with results highlighting

根据评论进行编辑:

您不一定需要在事后过滤分面返回的结果,只需确保只有您想要的构面与原始查询匹配。如果返回所有方面,那么不属于搜索查询的构面将在它们上面出现0次。然后,您可以将facet.mincount = 1设置为仅获取在搜索结果中找到的构面。这是我用测试数据模拟的一个例子:

q=*Thom*&rows=0&df=speakers&wt=json&indent=true&facet=true&facet.field=speakers&facet.field=venues&facet.mincount=1&json.nl=map

Solr的回应:

"responseHeader": {
  "status": 0,
  "QTime": 3,
  "params": {
    "q": "*Thom*",
    "df": "speakers",
    "facet.field": [
      "speakers",
      "venues"
    ],
    "json.nl": "map",        
    "indent": "true",
    "facet.mincount": "1",
    "rows": "0",
    "wt": "json",
    "facet": "true",
    "_": "1431772681445"
  }
},
"response": {
  "numFound": 2,
  "start": 0,
  "docs": []
},
"facet_counts": {
  "facet_queries": {},
  "facet_fields": {
    "speakers": {
      "Mark Thomas": 1,
      "Thomas Moore": 1
    },
    "venues": {
      "Weill Thomas": 1
    }
  },
  "facet_dates": {},
  "facet_ranges": {},
  "facet_intervals": {},
  "facet_heatmaps": {}
}

答案 1 :(得分:0)

只是想指出所提出的解决方案的一个警告(即,基本上只是将您的facet子串查询作为主要的Solr查询,然后facet值将是您想要的)。这对多值字段无法正常工作。例如,如果一个文档有3个值的发音者,马克·托马斯","弗雷德·琼斯"," John Doe",那么查询&q; q = * *汤姆'将作为方面回归" Fred Jones"和#34; John Doe",以及#34; Mark Thomas",这不是理想的结果(即" Fred Jones"和#34; John Doe& #34;不应退还)。因此对于单值字段,此解决方案可以工作,但对于多值字段,您可能必须编写一个中间Web服务来过滤掉不匹配(例如" Fred Jones"和&#34 ; John Doe")。 Solr应该添加一个facet.substring参数,该参数与facet.prefix参数类似,但是对facet值进行子串过滤而不是前缀过滤。