Solr 索尔:其中x在y和z之间
我有一个Solr模式,其中我的对象可以有以下两个字段:Solr 索尔:其中x在y和z之间,solr,solr-query-syntax,Solr,Solr Query Syntax,我有一个Solr模式,其中我的对象可以有以下两个字段: SerialNumberStart 序列号趋势 例如: "SerialNumberStart": "0000067098910", "SerialNumberEnd": "0000067098920", 查询时,我希望能够在查询中传入SerialNumberStart。如果该serialNumber与文档的serialNumberStart匹配,我想获取该文档。但是,当它不匹配时,我希望查找我传入的serialNumber在Seria
- SerialNumberStart
- 序列号趋势
"SerialNumberStart": "0000067098910",
"SerialNumberEnd": "0000067098920",
查询时,我希望能够在查询中传入SerialNumberStart
。如果该serialNumber与文档的serialNumberStart匹配,我想获取该文档。但是,当它不匹配时,我希望查找我传入的serialNumber在SerialNumberStart和SerialNumberRend之间的所有文档。or后面的查询的第二部分应该类似于:获取someSerialStart位于documentSerialStart和documentSerialEnd之间的文档
我从JavaScript构建查询。我试图按如下方式将范围组合在一起,但它似乎不正确,但我不知道如何修复它
var value = req.query['matchedPattern.serialNumber'];
return 'SerialSNumberStart:' + value + ' OR (SerialNumberStart:[* TO ' + value + '] AND SerialNumberEnd:[' + value + ' TO *])';
谢谢。您的查询似乎与您的查询相反。您正在查找SerialNumberStart之前和SerialNumberRend之后的记录。首先在Solr中获得正确的查询,然后将其映射到Javascript
另外,您似乎没有引用第一个子句中的值。您可能希望这样做以防万一。我根据您的澄清更新了答案。
您需要调查4个案例:
1序列号存在
2序列号不存在
2.1在序列号之前获取范围
2.2获取序列号后的范围
凭直觉,我肯定会把它分成两个部分:
存在1个序列号,因此将其服务回客户。下面是它的外观:
http://solrserver.us-west-2.compute.amazonaws.com:8983/solr/hellosolr/select?indent=on&q=id:S9V7464-APL-KIT3&wt=json
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"id:S9V7464-APL-KIT5",
"indent":"on",
"start":"0",
"sort":"id asc",
"rows":"1",
"wt":"json"}},
"response":{"numFound":0,"start":0,"docs":[]
}}
答案是:
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"id:S9V7464-APL-KIT3",
"indent":"on",
"wt":"json"}},
"response":{"numFound":1,"start":0,"docs":[
{
"id":"S9V7464-APL-KIT3",
...
如果您的序列号不存在,响应将返回“numFound”:1,此时您需要运行搜索。因此,如果没有文档,查询将如下所示:
答复如下:
http://solrserver.us-west-2.compute.amazonaws.com:8983/solr/hellosolr/select?indent=on&q=id:S9V7464-APL-KIT3&wt=json
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"id:S9V7464-APL-KIT5",
"indent":"on",
"start":"0",
"sort":"id asc",
"rows":"1",
"wt":"json"}},
"response":{"numFound":0,"start":0,"docs":[]
}}
2.1因此,在序列号之前,您需要下一个邻居。有两件事我要添加到递减范围搜索,排序和限制答案的数量。以下是查询的内容:
http://solrserver.us-west-2.compute.amazonaws.com:8983/solr/hellosolr/select?indent=on&q=id:[*%20TO%20S9V7464-APL-KIT5]&rows=1&sort=id%20desc&start=0&wt=json
答复如下:
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"id:[* TO S9V7464-APL-KIT5]",
"indent":"on",
"start":"0",
"sort":"id desc",
"rows":"1",
"wt":"json"}},
"response":{"numFound":25,"start":0,"docs":[
{
"id":"S9V7464-APL-KIT3",
"name":["Belkin Mobile Power Cord for iPod w/ Dock"],
"manu":["Belkin"],
"manu_id_s":"belkin",
"cat":["electronics",
"connector"],
"features":["car power adapter, white"],
"weight":[6.7],
"price":[19.95],
"popularity":[1],
"inStock":[false],
"store":["45.18014,-93.87741"],
"manufacturedate_dt":"2005-08-01T16:30:25Z",
"_version_":1547654166135963648}]
}}
2.2您需要一个升序范围,根据返回的单据数量进行排序和限制。比如:
http://solrserver.us-west-2.compute.amazonaws.com:8983/solr/hellosolr/select?indent=on&q=id:[S9V7464-APL-KIT5%20TO%20*]&rows=1&sort=id%20asc&start=0&wt=json
答复与此类似:
{
"responseHeader":{
"status":0,
"QTime":0,
"params":{
"q":"id:[S9V7464-APL-KIT5 TO *]",
"indent":"on",
"start":"0",
"sort":"id asc",
"rows":"1",
"wt":"json"}},
"response":{"numFound":8,"start":0,"docs":[
{
"id":"S9V7464-APL-KIT7",
"name":["Belkin Mobile Power Cord for iPod w/ Dock"],
"manu":["Belkin"],
"manu_id_s":"belkin",
"cat":["electronics","connector"],
"features":["car power adapter, white"],
"weight":[6.7],
"price":[19.95],
"popularity":[1],
"inStock":[false],
"store":["45.18014,-93.87741"],
"manufacturedate_dt":"2005-08-01T16:30:25Z",
"_version_":1547654166137012224}]
}}
增加行数会返回更多文档,修改开始可以用作第n个相邻行的偏移量。是否得到错误的结果?还是你有错误?您是否尝试过直接查询solr而不是在javascript中形成查询?如果是,该查询是否给出结果?@jay我的查询没有结果。请阅读我对以下答案的评论;我非常需要帮助来实际构建查询以实现我想要的功能。别担心JS部分,我被卡住的地方是。。我只有一个值,对吗?我正在搜索的文档中的序列号。我运行的查询需要返回带有该序列号的文档,或者返回我的值在这些文档的序列号开始和序列号结束之间的文档。我没有5分或19分,对我来说?难道不是300到300就返回300吗?你现在把我弄糊涂了。:)300到300不能给你正确的结果,这是肯定的。让我解释一下,看看你的解释是否正确:如果你有完整的序列号空间:1,2,3,7,8,9;然后,如果搜索3,则需要序列号为3的文档;如果搜索5,则需要返回2个范围中的文档:1、2、3和7、8、9。这就是你所说的吗?我认为你没有得到结果,因为你使用的是AND运算符,并且没有两个子范围内的文档。唯一的问题是OR将返回整个搜索空间,即除了不存在的文档之外的所有内容。还是我理解错了?哈哈,对不起。这也让我困惑,我已经向我的客户询问了五次他们想要实现的目标。。因此,如果我查询任何文档,它都会有一个serialNumberStart
和一个serialnumberrend
。如果我搜索serialNumberStart,它发现一个与之匹配的文档,我想返回该文档。(就像你的例子3)。如果它在serialStart=3的位置找不到它,但是有一个serialStart:2和serialEnd:5的文档,我想返回该文档,因为3在这个范围(2->5)之间。我想我现在明白了,这是有道理的。您可能只需要对响应进行排序并限制文档的数量。我相应地更新了上面的答案。看看它是否对你也有意义。也许我的问题表述错了。实际上,我一直在构建正确的查询。我传入一个值,我想要具有该SNStart值的文档,或者我的值在SNStart和SNEnd之间的所有文档。我不确定如何构建该查询,我甚至不确定to
是否是正确的方法?