我的Elasticsearch DB中有一个像这样的文档:
{
"tags" => [
"tag-1",
"tag-2",
"tag-3",
"tag-A"
]
"created_at" =>"2013-07-02 12:42:19 UTC",
"label" =>"Mon super label"
}
我希望能够使用此条件过滤我的文档:Documents标签数组必须具有标签1,标签3和标签2,但不能具有标签A。
我尝试使用布尔过滤器,但无法使其正常工作!
这是一种似乎可以完成您想要的方法:http
:
//sense.qbox.io/gist/4dd806936f12a9668d61ce63f39cb2c284512443
首先,我创建了一个带有显式映射的索引。我这样做是"tags"
为了将属性设置为"index": "not_analyzed"
。这意味着将不会以任何方式修改文本,这将简化此示例的查询过程。
curl -XPUT "http://localhost:9200/test_index" -d'
{
"mappings": {
"docs" : {
"properties": {
"tags" : {
"type": "string",
"index": "not_analyzed"
},
"label" : {
"type": "string"
}
}
}
}
}'
然后添加一些文档:
curl -XPUT "http://localhost:9200/test_index/docs/1" -d'
{
"tags" : [
"tag-1",
"tag-2",
"tag-3",
"tag-A"
],
"label" : "item 1"
}'
curl -XPUT "http://localhost:9200/test_index/docs/2" -d'
{
"tags" : [
"tag-1",
"tag-2",
"tag-3"
],
"label" : "item 2"
}'
curl -XPUT "http://localhost:9200/test_index/docs/3" -d'
{
"tags" : [
"tag-1",
"tag-2"
],
"label" : "item 3"
}'
然后,我们可以在过滤器中使用must
和must_not
子句进行查询bool
,如下所示:
curl -XPOST "http://localhost:9200/test_index/_search" -d'
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"terms": {
"tags": [
"tag-1",
"tag-2",
"tag-3"
],
"execution" : "and"
}
}
],
"must_not": [
{
"term": {
"tags": "tag-A"
}
}
]
}
}
}
}
}'
产生正确的结果:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "docs",
"_id": "2",
"_score": 1,
"_source": {
"tags": [
"tag-1",
"tag-2",
"tag-3"
],
"label": "item 2"
}
}
]
}
}
注意子句中过滤器中的"execution" : "and"
参数。这意味着将仅返回具有所有指定内容的文档(而不是与一个或多个匹配的文档)。那可能就是你所缺少的。您可以在ES文档中阅读有关选项的更多信息。terms``must``"tags"
如果您在上安装并运行了ES,我在这里做了一个可运行的示例,您可以使用它,localhost:9200
也可以提供自己的端点。
问题内容: 我为嵌套对象具有以下索引架构: 数据如下: 现在,如果我做一些简单的查询,例如找到“ isCurrentWorkplace”为true且title.id为259的工作场所,则它可以正常工作: 现在的问题是,我需要组合这些必须子句。例如,我需要找到一条记录,其“ isCurrentWorkplace”为true,“ title.id”为259 AND “ isCurrentWorkpla
还有 我可以使用多个过滤器在一个必须像下面的代码:
应查找下列文件: 我尝试了以下方法: 它应该(但不是)这样工作: bool通过或和部分组合 第一个按查询选择 筛选器使用bool组合by或must_not` 但其行为类似于与via AND子句组合。例如。当我删除“must”或“must_not”时,查询工作。 如何通过OR子句更改查询以将“must”与“must_not”组合? Elasticsearch版本为
问题内容: 我是elasticsearch的新手,在must和filter之间感到困惑。我想在条款之间执行and操作,所以我这样做了 开机自检/ xyz / _search 这给了我所需的结果,既匹配了术语,又使用了像这样的过滤器 开机自检/ xyz / _search 我得到相同的结果,所以什么时候应该使用must以及什么时候应该使用filter?有什么区别? 问题答案: 有助于得分。在中,查询
我目前正在使用ElasticSearch(PHP客户端)构建一个电子商务系统搜索,但遇到了一个问题 我存储的数据是简单文本(如产品名称)和列表(如颜色、大小)的混合体 我遇到的问题是当产品没有任何颜色时 我有以下字段 所以当我发送一个产品时,它看起来是这样的 这就像预期的一样,但是当我尝试发送这样的东西时 它抛出了一个错误: {“error”:{“root_cause”:[{“type”:“map
发布/xyz/_search 我得到了相同的结果,那么什么时候应该使用must和什么时候应该使用filter呢?有什么区别?