我使用以下语法获得了很好的搜索结果,但是我在添加布尔条件时遇到了麻烦。
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”的方式匹配包含搜索词的文档,并按文档的成人属性进行过滤?
提前致谢。
你的 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
}
'
过滤器通常更快,因为:
- 他们不需要对文档进行评分,只需包含或排除文档即可
- 它们可以被缓存和重用
你的 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
}
'
过滤器通常更快,因为:
- 他们不需要对文档进行评分,只需包含或排除文档即可
- 它们可以被缓存和重用