Well,不要刷屏了

如何设计 mapping

Elasticsearch | 作者 es_zoom | 发布于2018年04月09日 | 阅读数:4478

想实现一个人相关信息的搜索,包含姓名,身份证号,出生日期,性别,学历,各种地址:如出生地址,现住址,户籍地址等。如何设计mapping?
 
支持模糊搜索 姓名、身份证、各种地址,性别,身份证等,支持类似Google搜索似的自动补全查询,
姓名支持拼音搜索,首字母,同音字搜索,
身份证支持模糊搜索,各种地址支持模糊搜索。

例如搜索张三 男 河北,能从相应的字段中搜索出结果。
 
谢谢!
 
 
 
已邀请:

yayg2008

赞同来自: wokeyi

补充一点:
“例如搜索张三 男 河北,能从相应的字段中搜索出结果”,这里需要搜索的字段要添加到_all (默认所有字段都会加入all,通常为了性能考虑,会设置默认不加,指定字段添加)。

chinagrowing

赞同来自:

1. 首先确定下字段类型,是int, float, string,date。按照你提供信息,“姓名、身份证、各种地址”这些都是字符串
2. 确认字段是不是需要创建索引。索引字段即你对这个字段有查询需求。所以,“姓名、身份证、各种地址”这些有查询需求的都必须配置索引。
3. 对于string类型字符串,需要确定是否需要分词。例如身份证肯定不需要分词,因为本身就是一个字符串,而地址需要分词,例如“北京市朝阳区望京站”,你可能希望搜索“朝阳 望京”能够搜索出匹配记录。
4. 对于date类型(如果有),确认下日期的格式。es默认UTC和毫秒时间戳都支持,而对于其他时间格式,如“20180409”这种类型,就需要设置相应的format字段,显式告诉es你的字段格式。
 
按照这几个步骤来,你应该问题不大。
 
ps: "姓名支持拼音搜索", 那需要再存储一个字段,记录姓名的拼音。
 

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

一楼回复很详细了,补充一下:
1自动补足借助:suggester实现,或者简单点prefix前缀匹配实现,
2模糊搜索支持wildcard实现。

es_zoom

赞同来自:

谢谢大家的回复,初步设计了以下mapping,各位给看看,有什么不妥么?字段没有列全
{
"settings": {
"analysis": {
"analyzer": {
"simple_py_analyzer": {
"tokenizer": "whitespace",
"filter": [
"simple_py_filter",
"lowercase"
]
},
"full_py_analyzer": {
"tokenizer": "whitespace",
"filter": [
"full_py_filter",
"lowercase"
]
},
"joined_full_py_analyzer": {
"tokenizer": "whitespace",
"filter": [
"joined_full_py_filter",
"lowercase"
]
}
},
"filter": {
"simple_py_filter": {
"type": "pinyin",
"keep_first_letter": true,
"keep_full_pinyin": false
},
"full_py_filter": {
"type": "pinyin",
"keep_first_letter": false,
"keep_full_pinyin": true,
"keep_none_chinese_in_first_letter": true
},
"joined_full_py_filter": {
"type": "pinyin",
"keep_first_letter": false,
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true
}
}
}
},
"mappings": {
"user": {
"_all": {
"enabled": true,
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
"term_vector": "no",
"store": "false"
},
"properties": {
"name": {
"type": "multi_field",
"fields": {
"name": {//姓名
"type": "text", 
                         "include_in_all": "true"
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
},
"s_py": {//首字母拼音
"type": "text",
"analyzer": "simple_py_analyzer",
"search_analyzer": "simple_py_analyzer"
},
"f_py": {//全拼
"type": "text",
"analyzer": "full_py_analyzer",
"search_analyzer": "full_py_analyzer"
},
"jf_py": {//完整全拼
"type": "text",
"analyzer": "joined_full_py_analyzer",
"search_analyzer": "joined_full_py_analyzer"
}
},
"birthday": {//出生日期
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"idcard": {//身份证号
"type": "keyword", 
                         "include_in_all": "true"
},
"sex": {//性别
"type": "keyword", 
                         "include_in_all": "true"

},
"birthplace": {//出生地址
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word", 
                         "include_in_all": "true"

},
"census": {//户籍地址
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word", 
                         "include_in_all": "true"
},
"suggest": {
"type": "completion"
}
}
}
}
}
}

要回复问题请先登录注册