在solr query

时间:2017-05-27 07:53:15

标签: json solr

我是solr的新手。我是否混淆是使用q还是fq。假设我有一些字段

  • 州(可能的值:喀拉拉邦,德里,西部等)
  • 标题
  • processed_title
  • 描述

索引文件为statetitleprocessed_titledescription

我想要

的结果

boiler keyword (all matches) in state delhi and also boiler keyword (exclude repair) in kerala

我想的一个解决方案

q=((boiler AND state:delhi) OR (boiler AND -repair AND state:kerala))

其他解决方案可能是

q=boiler&fq=(state:gujarat OR (state:kerala AND -processed_title:repair -title:repair -description:repair))

我必须在python中编写json interafe来进行查询。 JSON可能看起来像(在字典下面只是一个例子)

{ q: 'boiler', filter: { state: kerala, price: [10 TO 100] } } 我的问题是:

  1. 是否可以在q或更好地编写所有内容以同时使用qfq,或者有任何方法吗?
  2. 如果我想编写一个json接口api,这将是创建查询1或2的简单方法,还是有更好的解决方案?
  3. 我正在使用solr 4.10。

    由于

2 个答案:

答案 0 :(得分:0)

使用q和fq要好得多。你把fq用于过滤掉文档(结果是二进制,文档是在里面还是在里面),你输入q想要搜索的内容(这是更渐进的,一个文档可以匹配所有关键字和另一个一个只匹配一个。如果你可以把所有东西放在fq中,那么,q = *:*就完全可以了。)

差异是:

  • fq不影响分数,只过滤掉文档。 q影响分数
  • fq被缓存(除非你要求它不被缓存),因此,在交换初始惩罚时,使用相同fq的下一个查询会快得多。这是最大的交易。

关于json api问题,我真的不明白你的意思。

答案 1 :(得分:0)

一个好的经验法则是,如果你的字段有一组固定的值,则使用fq。在你的情况下,状态应该在fq中。 q用于计算solr得分。分数越高意味着匹配越好。您可以阅读更多here

fq不用于计算分数。 SOLR中的文件要么具有喀拉拉邦,要么没有。

假设您的系统中有三个文档。

doc1: {'title':'idli idli idli','state':['kerala','karnataka']}
doc2: {'title':'idli','state':['kerala']}
doc3: {'title':'paneer','state':['punjab']}

要查询idli和州喀拉拉邦,您可以使用

q=idli&fq=kerala

这有点过于简单,但Solr会为doc1返回更高的分数,因为它有更多idli这个单词的实例而不是doc2。 fq不会(也不应该)影响分数。一个州有idli或它没有