在ElasticSearch中,我有一个电子邮件字段和标题字段的映射,如下所示:
{
"person": {
"mappings": {
"_doc": {
"email": {
"type": "keyword",
"boost": 80
},
"title": {
"type": "text",
"boost": 70
}
}
}
}
每个人可以有多个电子邮件地址和头衔。所以,我将这些值存储在数组中。我使用query_string来搜索具有电子邮件地址和/或头衔的人。电子邮件地址需要完全匹配。
我用下列数据为一份文件编制了索引。在Kibana中调用GET person/_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))"
}
}
}
响应:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
但同样的查询适用于文本类型的标题字段。
请求:
GET person/_search
{
"query" : {
"query_string" : {
"query" : "SEARCH_ENTITY:PERSON AND (title: ((actor)))"
}
}
}
响应:
{
"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"
}
映射无需更改任何内容,只需更改字段值即可。