我在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"
},
]
答案 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"
}
}