elasticsearch Elasticsearch:按数组属性搜索多个文档,elasticsearch,elasticsearch" /> elasticsearch Elasticsearch:按数组属性搜索多个文档,elasticsearch,elasticsearch" />

elasticsearch Elasticsearch:按数组属性搜索多个文档

elasticsearch Elasticsearch:按数组属性搜索多个文档,elasticsearch,elasticsearch,我正在尝试将Elasticsearch与Symfony 4结合使用。这是我第一次尝试 我的索引:当我跑步时 GET app_file_dev/_search { "query": { "match_all": {} } } 我有 { "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }

我正在尝试将Elasticsearch与Symfony 4结合使用。这是我第一次尝试

我的索引:当我跑步时

GET app_file_dev/_search
{
  "query": {
    "match_all": {}
  }
}
我有

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 1,
    "hits": [
      {
        "_index": "app_file_dev",
        "_type": "file",
        "_id": "5",
        "_score": 1,
        "_source": {
          "id": 5,
          "tags": [
            "blue"
          ]
        }
      },
      {
        "_index": "app_file_dev",
        "_type": "file",
        "_id": "8",
        "_score": 1,
        "_source": {
          "id": 8,
          "tags": [
            "blue",
            "green"
          ]
        }
      },
      {
        "_index": "app_file_dev",
        "_type": "file",
        "_id": "6",
        "_score": 1,
        "_source": {
          "id": 6,
          "tags": [
            "green"
          ]
        }
      },
      {
        "_index": "app_file_dev",
        "_type": "file",
        "_id": "7",
        "_score": 1,
        "_source": {
          "id": 7,
          "tags": []
        }
      }
    ]
  }
}
我想按tags字段进行搜索,它是数组类型

然后如果我跑

GET app_file_dev/_search
{
  "query": {
    "match": {
      "tags": {
        "query": "blue"
      }
    }
  }
}
我可以成功地获得标记为“蓝色”的两个文档

如果我跑

GET app_file_dev/_search
{
  "query": {
    "match": {
      "tags": {
        "query": "blue green",
        "operator": "or"
      }
    }
  }
}
我希望它能返回8号文件,其中有标签“蓝色”和“绿色”

但不管是‘或’或‘和’。我只得到一个空数组


我的理解有什么问题吗?

也许你要找的是一个查询字符串?试试这个

$params = [
    'index' => 'my_index',
    'type'  => 'my_type',
    'size'  => 10,
    'body'  => [
        "query" => [
            "query_string" => [
                "default_field" => "my_field",
                "query" => "blue OR green"
            ]
        ]
    ]
];

$search = $client->search($params);
$hits = $search['hits']['hits'];
上面的代码片段将在您的
my\u索引
->
my\u类型
索引中查找数据,现在将重点放在
my\u字段
,该字段的关键字为蓝色绿色


您可以在此处参考有关查询字符串的更多详细信息:

也许您要查找的是查询字符串?试试这个

$params = [
    'index' => 'my_index',
    'type'  => 'my_type',
    'size'  => 10,
    'body'  => [
        "query" => [
            "query_string" => [
                "default_field" => "my_field",
                "query" => "blue OR green"
            ]
        ]
    ]
];

$search = $client->search($params);
$hits = $search['hits']['hits'];
上面的代码片段将在您的
my\u索引
->
my\u类型
索引中查找数据,现在将重点放在
my\u字段
,该字段的关键字为蓝色绿色


您可以在此处参考有关查询字符串的更多详细信息:

因为您处理的是数组字段,并且您想要的文档既有
蓝色
又有
绿色
,您可以在布尔查询的筛选/必须子句中使用,如下所示:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "tags": "blue"
          }
        },
        {
          "term": {
            "tags": "green"
          }
        }
      ]
    }
  }
}
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "tags": [
              "blue",
              "green"
            ]
          }
        }
      ]
    }
  }
}
如果您想找到绿色或蓝色或两者都作为标记的文档,则可以使用。查询结果如下:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "tags": "blue"
          }
        },
        {
          "term": {
            "tags": "green"
          }
        }
      ]
    }
  }
}
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "tags": [
              "blue",
              "green"
            ]
          }
        }
      ]
    }
  }
}

由于您处理的是数组字段,并且希望文档同时具有
蓝色
绿色
,因此您可以在bool查询的filter/must子句中使用,如下所示:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "tags": "blue"
          }
        },
        {
          "term": {
            "tags": "green"
          }
        }
      ]
    }
  }
}
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "tags": [
              "blue",
              "green"
            ]
          }
        }
      ]
    }
  }
}
如果您想找到绿色或蓝色或两者都作为标记的文档,则可以使用。查询结果如下:

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "tags": "blue"
          }
        },
        {
          "term": {
            "tags": "green"
          }
        }
      ]
    }
  }
}
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "tags": [
              "blue",
              "green"
            ]
          }
        }
      ]
    }
  }
}

谢谢你的帮助。我尝试了“查询”=>“蓝色和绿色”和“查询”=>“蓝色或绿色”,两种方法都按照我的预期工作。然而,当我尝试“查询”=>“蓝绿色”、“默认_运算符”=>“和”时,我得到了一个空结果。我可以问一下我应该如何使用“default\u operator”字段吗?这是因为如果你有一个“query”和“default\u operator”,那么你的“query”中的每个空格都将被替换或添加到你的“default\u operator”中,这就是为什么我通常不使用它的原因,例如:你的“default\u operator”是或,那么在你的“query”中你就有了“蓝色和绿色”,这将导致“蓝色或绿色”,希望您理解。以下是参考资料:如果您觉得我的答案有帮助,请投票或将我的答案标记为正确答案,非常感谢!:)问题是我没有在这两个词之间添加和,“查询”=>“蓝色绿色”,“默认运算符”=>“和”,但似乎“default_操作符”并没有像我预期的那样替换空格。好吧,我的不好,但让我澄清一下1.使用“default_操作符”的目的是什么?单词本身“蓝绿色”已经被理解为“蓝绿色”“因为查询字符串中的空白被视为和2。你用的是什么版本的elasticsearch?谢谢,伙计。我用的是“6.3.2”。我试图修复我的前任编写的一个bug,因此我希望能够找到根本原因,而不是在查询字符串中显式添加“AND/OR”。谢谢您的帮助。我尝试了“查询”=>“蓝色和绿色”和“查询”=>“蓝色或绿色”,两种方法都按照我的预期工作。然而,当我尝试“查询”=>“蓝绿色”、“默认_运算符”=>“和”时,我得到了一个空结果。我可以问一下我应该如何使用“default\u operator”字段吗?这是因为如果你有一个“query”和“default\u operator”,那么你的“query”中的每个空格都将被替换或添加到你的“default\u operator”中,这就是为什么我通常不使用它的原因,例如:你的“default\u operator”是或,那么在你的“query”中你就有了“蓝色和绿色”,这将导致“蓝色或绿色”,希望您理解。以下是参考资料:如果您觉得我的答案有帮助,请投票或将我的答案标记为正确答案,非常感谢!:)问题是我没有在这两个词之间添加和,“查询”=>“蓝色绿色”,“默认运算符”=>“和”,但似乎“default_操作符”并没有像我预期的那样替换空格。好吧,我的不好,但让我澄清一下1.使用“default_操作符”的目的是什么?单词本身“蓝绿色”已经被理解为“蓝绿色”“因为查询字符串中的空白被视为和2。你用的是什么版本的elasticsearch?谢谢,伙计。我用的是“6.3.2”。我试图修复我的前任编写的一个bug,因此我希望能够找到根本原因,而不是在查询字符串中显式添加“AND/OR”。谢谢您的帮助。我不能像实际情况那样简单地使用过滤器,我们需要按多个字段进行搜索,因此如果我将它们作为过滤器,那么如果
标记
上没有匹配项,则结果将为空。您可以始终在
过滤器
必须
应该
子句或根据需要的任意组合之间切换。感谢您的帮助。我不能像在实际情况中那样简单地使用过滤器,我们需要按多个字段进行搜索,因此如果我将它们作为过滤器,那么如果
标记
上没有匹配项,结果将为空。您可以根据需要随时在
过滤器
必须
应该
子句或它们的任意组合之间切换。