elasticsearch ElasticSearch:关键字数据类型字段与值数组的精确匹配
在ElasticSearch中,我有一个电子邮件字段和标题字段的映射,如下所示:elasticsearch ElasticSearch:关键字数据类型字段与值数组的精确匹配,elasticsearch,kibana,elasticsearch-6.5,elasticsearch,Kibana,Elasticsearch 6.5,在ElasticSearch中,我有一个电子邮件字段和标题字段的映射,如下所示: { "person": { "mappings": { "_doc": { "email": { "type": "keyword", "boost": 80 },
{
"person": {
"mappings": {
"_doc": {
"email": {
"type": "keyword",
"boost": 80
},
"title": {
"type": "text",
"boost": 70
}
}
}
}
每个人可以有一个以上的电子邮件地址和标题。所以,我将这些值存储在数组中。
我使用query_字符串搜索具有电子邮件地址和/或标题的人员。电子邮件地址需要完全匹配
我用以下数据为一个文档编制了索引。在Kibana中调用GET person/\u search
,将在结果中生成以下文档
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "person",
"_type": "_doc",
"_id": "101",
"_score": 1,
"_source": {
"title": """["Actor", "Hero", "Model"]""",
"email": """["jdepp@hotmail.com", "johnny@hollywood.com", "jdepp@gmail.com", "johnny.depp@yahoo.com"]""",
"SEARCH_ENTITY": "PERSON"
}
}
]
}
}
现在,当我添加一些电子邮件搜索参数时,我不会在结果中返回文档。记住,电子邮件的类型是关键字
请求:
GET person/_search
{
"query" : {
"query_string" : {
"query" : "SEARCH_ENTITY:PERSON AND (email: (johnny.depp@yahoo.com))"
}
}
}
GET person/_search
{
"query" : {
"query_string" : {
"query" : "SEARCH_ENTITY:PERSON AND (title: ((actor)))"
}
}
}
答复:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 20.137747,
"hits": [
{
"_index": "person",
"_type": "_doc",
"_id": "101",
"_score": 20.137747,
"_source": {
"ID": "101",
"title": """["Actor", "Hero", "Model"]""",
"email": """["jdepp@hotmail.com", "johnny@hollywood.com", "jdepp@gmail.com", "johnny.depp@yahoo.com"]"""
}
}
]
}
}
但对于文本类型的标题字段,也可以使用相同的查询
请求:
GET person/_search
{
"query" : {
"query_string" : {
"query" : "SEARCH_ENTITY:PERSON AND (email: (johnny.depp@yahoo.com))"
}
}
}
GET person/_search
{
"query" : {
"query_string" : {
"query" : "SEARCH_ENTITY:PERSON AND (title: ((actor)))"
}
}
}
答复:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 20.137747,
"hits": [
{
"_index": "person",
"_type": "_doc",
"_id": "101",
"_score": 20.137747,
"_source": {
"ID": "101",
"title": """["Actor", "Hero", "Model"]""",
"email": """["jdepp@hotmail.com", "johnny@hollywood.com", "jdepp@gmail.com", "johnny.depp@yahoo.com"]"""
}
}
]
}
}
有人能告诉我,我需要做什么,使这个工作的电子邮件字段是关键字类型
注意:如果我只存储一个电子邮件地址而不使用数组,那么它可以正常工作
谢谢。在索引文档之前,请确保在
title
和email
中解析json数组字符串:
POST person/_doc/101
{
"title": [
"Actor",
"Hero",
"Model"
],
"email": [
"jdepp@hotmail.com",
"johnny@hollywood.com",
"jdepp@gmail.com",
"johnny.depp@yahoo.com"
],
"SEARCH_ENTITY": "PERSON"
}
映射无需更改,只需更改字段值。当我从ElasticSearch检索文档时,我会看到如下标题和电子邮件字段:“标题”:“[“演员”、“英雄”、“模型”]”,“电子邮件”:“[”jdepp@hotmail.com", "johnny@hollywood.com", "jdepp@gmail.com“约翰尼。depp@yahoo.com"]"""这让我觉得数组值的索引是正确的,不是吗?我不明白为什么数组的开头和结尾都有3个双引号。这就是你索引它们的方式。三重引号是一种Kibana约定,可以提高可读性,因为在严格有效的JSON中,通常必须对引号进行转义,如
“[\”Actor\“…
。长话短说,您已经为本应是字符串数组的字符串编制了索引。感谢您解释了三重引号。我正在用转义双引号和数组传递值。仍然不起作用。”[\“Actor\”,“Hero\”,“Model\”]仍然不是。按照我的回答中提到的方式传递。没有前导引号…如果我按照你在示例中列出的方式传递数组,它会工作。但是我需要使用PUT API将JSON正文传递给ElasticSearch。在正文中,我将这些电子邮件作为JSONArray对象传递。在这种情况下,这不起作用。看起来ElasticSearch认为整个数组是一个字符串你知道如何将数组作为JSON传递吗?谢谢。