我是ElasticSearch的新手,试图学习它。
在常规的RDBM中,我可以执行" in"声明如下:
select * from results where mycal in ['abc', 'def', 'ghi'] and col2 in ['er', 'es', 'et']
我如何在elasticsearch中执行此操作?
由于
答案 0 :(得分:2)
很多将取决于您如何索引elasticsearch中的数据。但您可以使用terms filter来实现上述目标:
{
"filter": {
"and": [
{
"terms": {
"cal": [
"abc",
"def",
"ghi"
],
"execution": "or"
}
},
{
"terms": {
"col2": [
"er",
"es",
"et"
],
"execution": "or"
}
}
]
}
}
答案 1 :(得分:2)
根据您是否需要filter or a query,您可以使用bool
查询/过滤器或快捷terms
查询/过滤器(两者都链接到查询,正如我所料这不会被缓存)。
当您使用多个字段时,您希望在其中使用bool
terms
查询:
{
"query" : {
"bool" : {
"should" : [
{ "terms" : { "mycal" : [ "abc", "def", "ghi" ] } },
{ "terms" : { "col2" : [ "er", "es", "et" ] } }
],
"minimum_should_match" : 2
}
}
}
默认情况下,"minimum_should_match"
为1
,这会使上述查询成为OR
。
这假定文件如:
{ "mycal" : "abc", "col2" : "es" }
{ "mycal" : "def", "col2" : "er" }
如果您的字段嵌套在对象中(例如{ "key" : { "mycal" : "abc" } }
),那么您只需访问它们"key.mycal"
。
重要的是你如何进行映射。默认情况下,您的字符串将以全部小写进行分析和存储,因此您需要使用全部小写的term
(s)查询进行搜索。如果您想查找"ABC"
,那么您仍然寻找"abc"
。但是,如果您使用了其他内容,例如match
而不是term
(s),那么您无需将其全部放在小写中:
{
"query" : {
"bool" : {
"should" : [
{ "match" : { "mycal" : "ABC" } },
{ "match" : { "mycal" : "DEF" } },
{ "match" : { "mycal" : "GHI" } },
{ "match" : { "col2" : "ER" } },
{ "match" : { "col2" : "ES" } },
{ "match" : { "col2" : "ET" } }
],
"minimum_should_match" : 2
}
}
}