elasticsearch Elasticsearch:按数组属性搜索多个文档
我正在尝试将Elasticsearch与Symfony 4结合使用。这是我第一次尝试 我的索引:当我跑步时
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 }
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”。谢谢您的帮助。我不能像实际情况那样简单地使用过滤器,我们需要按多个字段进行搜索,因此如果我将它们作为过滤器,那么如果
标记
上没有匹配项,则结果将为空。您可以始终在过滤器
、必须
、应该
子句或根据需要的任意组合之间切换。感谢您的帮助。我不能像在实际情况中那样简单地使用过滤器,我们需要按多个字段进行搜索,因此如果我将它们作为过滤器,那么如果标记
上没有匹配项,结果将为空。您可以根据需要随时在过滤器
、必须
、应该
子句或它们的任意组合之间切换。