问题 如何搜索术语并匹配布尔条件


我使用以下语法获得了很好的搜索结果,但是我在添加布尔条件时遇到了麻烦。

http://localhost:9200/index_name/type_name/_search?q=test

我的文件看起来像:

{
    "isbn":"9780307414922",
    "name":"Dark of the Night",
    "adult":false
}

这是我最好的猜测,如何实现我想要做的事情。

{
    "query_string": {
        "default_field": "_all",
         "query": "test"
    },
    "from": 0,
    "size": 20,
    "terms": {
        "adult": true
    }
}

然而,这导致“解析失败[元素[query_string]没有解析器]];}]”

我正在使用弹性搜索0.20.5。

如何按照“?q = test”的方式匹配包含搜索词的文档,并按文档的成人属性进行过滤?

提前致谢。


9861
2018-03-20 14:48


起源



答案:


你的 adult == true 条款必须是的一部分 query  - 你不能通过 term 子句作为顶级参数 search

所以你可以把它作为一个添加到查询中 查询条款,在这种情况下,您需要使用a连接两个查询子句 bool 查询,如下:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "bool" : {
         "must" : [
            {
               "query_string" : {
                  "query" : "test"
               }
            },
            {
               "term" : {
                  "adult" : true
               }
            }
         ]
      }
   },
   "from" : 0,
   "size" : 20
}
'

但实际上,查询条款应该用于:

  • 全文检索
  • 影响相关性得分的条款

但是,你的 adult == true 子句不用于更改相关性,也不涉及全文搜索。它更像是/不响应,换句话说,它更适合作为过滤条款。

这意味着您需要打包全文查询(_all 包含 test)在一个接受查询和过滤器的查询子句中: filtered 查询:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "term" : {
               "adult" : true
            }
         },
         "query" : {
            "query_string" : {
               "query" : "test"
            }
         }
      }
   },
   "from" : 0,
   "size" : 20
}
'

过滤器通常更快,因为:

  • 他们不需要对文档进行评分,只需包含或排除文档即可
  • 它们可以被缓存和重用

11
2018-03-20 15:46



由于这似乎是一个顶级的谷歌搜索结果,我只是更新,似乎正确的方法来做到这一点现在是一个 bool 查询。然后用一个 must 对于查询和 filter 对于过滤器。 - Blam


答案:


你的 adult == true 条款必须是的一部分 query  - 你不能通过 term 子句作为顶级参数 search

所以你可以把它作为一个添加到查询中 查询条款,在这种情况下,您需要使用a连接两个查询子句 bool 查询,如下:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "bool" : {
         "must" : [
            {
               "query_string" : {
                  "query" : "test"
               }
            },
            {
               "term" : {
                  "adult" : true
               }
            }
         ]
      }
   },
   "from" : 0,
   "size" : 20
}
'

但实际上,查询条款应该用于:

  • 全文检索
  • 影响相关性得分的条款

但是,你的 adult == true 子句不用于更改相关性,也不涉及全文搜索。它更像是/不响应,换句话说,它更适合作为过滤条款。

这意味着您需要打包全文查询(_all 包含 test)在一个接受查询和过滤器的查询子句中: filtered 查询:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "term" : {
               "adult" : true
            }
         },
         "query" : {
            "query_string" : {
               "query" : "test"
            }
         }
      }
   },
   "from" : 0,
   "size" : 20
}
'

过滤器通常更快,因为:

  • 他们不需要对文档进行评分,只需包含或排除文档即可
  • 它们可以被缓存和重用

11
2018-03-20 15:46



由于这似乎是一个顶级的谷歌搜索结果,我只是更新,似乎正确的方法来做到这一点现在是一个 bool 查询。然后用一个 must 对于查询和 filter 对于过滤器。 - Blam