【问题标题】:Why am I not getting expected results when searching in ElasticSearch using chrome plugin Sense?为什么我在使用 chrome 插件 Sense 在 ElasticSearch 中搜索时没有得到预期的结果?
【发布时间】:2015-06-24 21:17:32
【问题描述】:

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

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”为值(第一个和第三个)的记录?我在这里遗漏了一些微妙的地方吗?我知道 ElasticSearch 不会将值存储为数组,而是存储为无序集合。

【问题讨论】:

    标签: elasticsearch


    【解决方案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,当然,它会返回所有文档 :-)。

    【讨论】:

    • 工作得很好,谢谢。我可能会考虑更新标题以表明根本问题是由于我使用 Sense 的方式造成的
    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2019-04-25
    • 2013-12-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多