使用chrome插件Sense在ElasticSearch中搜索时,为什么我没有得到预期的结果?

时间:2015-06-24 13:00:59

标签: elasticsearch

所以我设置了以下数据集,以便我可以测试搜索存储多个值的字段:

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不会将值存储为数组,而是存储为无序集合。

1 个答案:

答案 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"
        }
      }
    }
  }
}

说明与GETPOST 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,当然,它会返回所有文件: - )。