Elasticsearch映射似乎不适用于查询

时间:2019-01-25 07:57:41

标签: elasticsearch

我在Spring Boot应用程序中使用Elasticsearch。在此应用程序中 我有索引customer,并且客户包含字段secretKey。此密钥是由数字和字母以FOOBAR-000

方式构建的字符串。

我的目标是通过他的密钥来选择一位客户,因此我将映射更改为“不分析”该字段,但似乎不起作用。我在做什么错了?

这是我的地图

curl -X GET 'http://localhost:9200/customer/_mapping'
 {
        "customer": {
            "mappings": {
                "customer": {
                    "properties": {
                        "secretKey": {
                            "type": "string",
                            "index": "not_analyzed"
                        }
                    }
                }
            }
        }
    }

但是我将运行查询

curl -XGET "http:/localhost:9200/customer/_validate/query?explain" -d'
{
    "query": {
        "query_string": {
        "query": "FOOBAR-3121"
    }
   }
}'

我得到以下解释:

"explanations": [
        {
            "index": "customer",
            "valid": true,
            "explanation": "_all:foobar _all:3121"
        },
    ]

3 个答案:

答案 0 :(得分:0)

据我所知,您有一个名为“ customer ”的索引,并且在该索引内有一个包含“ customer ”字段的文档。在您的情况下,secretKey应该嵌套在其中{<3}}如果出于某些原因,如果您封装对象而未指定它们是嵌套类型,则Elasticsearch决定具有奇怪的行为。This is the article from the doc that explains the behaviour in details.如果使用以下命令指定它: / p>

{
    "customer": {
        "mappings": {
            "_doc": {
              "properties": {
                  "customer": {
                     "type": "nested" 
                   }
              }
            }  
        }
    }
}

然后它应该可以处理您的查询

答案 1 :(得分:0)

您需要在查询中指定字段名称,否则,ElasticSearch会对所有字段执行查询,因此您会看到_all。试试这个:

curl -XGET "http:/localhost:9200/customer/_validate/query?explain" -d'
{
  "query": {
    "term": {
      "secretKey": {
        "value": "FOOBAR-3121"
      }
    }
  }
}'

答案 2 :(得分:0)

  

我的目标是通过他的秘密密钥选择一位客户

您的要求很严格,因此请使用MATCH查询选择仅匹配的客户!

curl -XGET "http:/localhost:9200/customer/_validate/query?explain" -d'
{
  "query": {
      "match": {
          "secretKey": "FOOBAR-3121"
     }
 }