如何返回字段以Elasticsearch中的特定字母开头的结果?

时间:2017-12-14 16:44:16

标签: elasticsearch startswith

我有一些像

这样的数据
"last_name": "AA-WEST"
"last_name": "VANDER AA"
"last_name": "ARENDES-AA"

我试图只获取以a开头的名称,即AA-WESTARENDES-AA

我试过

"match": {
    "last_name": {
        "query": "a",
        "operator": "and"
    }
}

"prefix": {
    "last_name": { "value" : "a" }
}

"match_phrase_prefix": {
    "last_name.keyword": {
        "query": "a"
    }
}

所有这些都会返回所有名称,而不仅仅是a

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

因此,您获得所有结果的原因是因为它是文本字段,而VANDER AA将转换为两个令牌。你可以尝试:

Set "start=1"
Set "step=1"
Set "end=50"

For /L %%A In (%start%,%step%,%end%) Do (
    Echo %random% %random%%random% %random% %random% %random% %random% %random% %random% %random% %random%
)

为避免这种情况,您可以将类型定义为关键字,然后使用

POST http://{esUri}/_analyze HTTP/1.1
Content-type: application/json

{
   "tokenizer": "standard",
   "text":      "VANDER AA"
}

但我想这并不是你想要的,因为你希望你的查询不区分大小写。要实现这一点,您应该为您的字段定义 normalizer ,这将在索引之前自动将您的数据转换为小写。您应该从定义索引开始

{ 
    "query": {
        "prefix" : { "last_name" : "A" }
    }
}

然后前缀查询将给出两个结果:

PUT http://{esAddress}/indexname HTTP/1.1
{
  "settings": {      
    "analysis": {
      "normalizer": {
        "lowercase_normalizer": {
          "type": "custom",
          "char_filter": [],
          "filter": ["lowercase"]
        }
      }     
    }
  },
  "mappings": {
    "yourtype": {
      "properties": {
        "last_name": {
          "type": "keyword",
          "doc_values": true,
          "normalizer": "lowercase_normalizer"
        }
      }
    }
  }
}