Solr 索尔:其中x在y和z之间

Solr 索尔:其中x在y和z之间,solr,solr-query-syntax,Solr,Solr Query Syntax,我有一个Solr模式,其中我的对象可以有以下两个字段: SerialNumberStart 序列号趋势 例如: "SerialNumberStart": "0000067098910", "SerialNumberEnd": "0000067098920", 查询时,我希望能够在查询中传入SerialNumberStart。如果该serialNumber与文档的serialNumberStart匹配,我想获取该文档。但是,当它不匹配时,我希望查找我传入的serialNumber在Seria

我有一个Solr模式,其中我的对象可以有以下两个字段:

  • 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
    是否是正确的方法?