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

标签 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 开头的名称

有什么想法吗?

最佳答案

所以你得到所有结果的原因是因为它是一个文本字段,而 VANDER AA 将被转换成两个标记。你可以试试:

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

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

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

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

但我猜这不是您要查找的内容,因为您希望查询不区分大小写。为此,您应该为您的字段定义 normalizer,它会在索引之前自动将您的数据转换为小写。您应该从定义索引开始

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

然后前缀查询会给你恰好两个结果:

{ 
    "query": {
        "prefix" : { "last_name" : "a" }
    }
}

关于elasticsearch - 如何在 Elasticsearch 中返回以特定字母或特定字母开头的字段的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818324/

相关文章:

jQuery - 如何按属性名称开头选择值

java - Hibernate Search 中的查询不按更新数据排序

path - 当存在路径集(path.data)时,如何在elasticsearch中存储碎片?

python - 基于字符串标准选择数据python

javascript - 如果文本或值以字符开头,则运行函数

r - Dplyr select_和starts_with对变量列表中的多个值

r - 关注 startsWith 和 R 中的多种模式

elasticsearch - 使用外部属性作为document_id会返回属性的名称,即document_id

elasticsearch - Elasticsearch-在找到的集群上备份和还原

python - 从 ElasticSearch 索引在 Python 中创建术语文档矩阵