所以我设置了以下数据集,以便我可以测试搜索存储多个值的字段:
post /test/participant
{
"Synonyms" : [ "foo" ]
}
post /test/participant
{
"Synonyms" : [ "bar" ]
}
post /test/participant
{
"Synonyms" : [ "foo", "bar" ]
}
我尝试通过尝试以下方式获取一些数据:
get /test/participant/_search
{
"query": {
"filtered": {
"filter": {
"term": { "Synonyms": "foo" }
}
}
}
}
我希望得到第一和第三条记录(见上面的顺序)。但是,我继续收回所有记录。我已经尝试了查询的完全没有结束以尝试获得一些合理的东西(这里没有足够的空间来添加它们)而且我继续得到的只是索引中的所有记录。有没有人知道如何用" foo"来查询这些记录?作为价值(第1和第3)?我在这里遗失了一些微妙的观点吗?我知道ElasticSearch不会将值存储为数组,而是存储为无序集合。
答案 0 :(得分:1)
我认为你是在Sense中运行这些查询,对吗?
您需要的命令是:
POST /test/participant
{"Synonyms":["foo"]}
POST /test/participant
{"Synonyms":["bar"]}
POST /test/participant
{"Synonyms":["foo","bar"]}
GET /test/participant/_search
{
"query": {
"filtered": {
"filter": {
"term": {
"Synonyms": "foo"
}
}
}
}
}
说明与GET
与POST
http方法有关。
在场景背后,Sense实际上将GET
请求转换为HTTP POST
(给定many browsers do not support HTTP GET requests with a request body)。这意味着,即使您编写GET
,实际的http请求也是POST
。
由于Sense具有强制请求方法的大写字母的自动完成功能,因此在决定是否GET
(而不是get
)请求时,它使用相同的大写字母请求机构。如果是,那么该请求将转换为POST
。如果它比较请求方法并且决定不是GET
则它按原样发送请求,这意味着使用get方法和body。由于身体被忽略,到达Elasticsearch的是get /test/participant/_search
,它基本上是match_all
,当然,它会返回所有文件: - )。