- 最近的智能政务对话项目,中涉及ELasticsearch数据库的使用,总结新得
- ES同义词建立过程中注意点,在指定位置建立同义词文件,一个注意点,词典中包含同义词所有词,stopwords 中不包含同义词中所有词,这点不满足,建立mapping无法成功
最近的智能政务对话项目,中涉及ELasticsearch数据库的使用,总结新得
DSL是最为全面的ES查询语言,研究DSL的相关使用方法对于用好ES,是十分重要,ELasticsearch是十分出色的开源搜索数据库。 原理: 主要倒排索引表,结合字典前缀树,KD-tree等加快查找速度。
倒排索引: 就是文档内容中的片段或者短语,对应文档唯一的docid形成的key-value对。 例子: “你好”:1,2,3,4(1,2,3,4分别对应文档ID)
Elasticsearch使用需要注意很多方面,包括工程以及和NLP,分词技术结合的部分,如何使用好ES对基于检索的智能对话系统来说是至关重要的。 工程方面: 1- ES的集群部署,以及ES的相关参数设置,由于我们的项目没有特别多的数据,但是项目是服务于全省的政务网站,处于谨慎考虑,我们选择ES集群作为后端,但是没有设置Ngnix等负载均衡的server,直接使用了3个ES组成的集群。 2- 使用java+springboot作为后端微服务框架,java框架不懂多线程和并发,一样简单出性能谁用谁知道,不过处于团队和自己技术栈的考虑,以及实际并发数的考虑,希望转为python+某框架+Ngnix的一系列。 3- 数据量实在是没有很大,导致内存分配直接16gES,48gCPU没得问题。 4- 插件,密码和账户用于过审,readonlyrest , 分词插件。 5- ik 分词插件, 设置同义词模块和ik字典以及停用词词典 NLP的query理解方面,因为涉及事项名称,皆为AB和BA形式,离线挖掘实体名词库和事件触发库,由于无cpu限制,用这个基于词典的模板方法,更好地线上理解相应query, 结合Elasticsearch 的文本查询相应数据库。 mappings 建立如下
DSL如下:
GET sx/_search
{
"size":50,
"query":{
"bool":{
"must":{
"bool":{
"should":[
{
"match":{
"name":{
"query":"不动产法人名称变更所需手续是什么?"
}
}},
{
"match":{
"name":{
"query":"变更",
"boost":3
}
}
}],
"must":{
"match":{
"name":{
"query":"不动产法人名称产业手续"
}
}
}
}
}
}
}
}
#################################
PUT sx
{
"settings": {
"index": {
"number_of_shards": "3",
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms_path": "analysis/synonym.txt"
}
},
"analyzer": {
"my_synonyms": {
"filter": [
"lowercase",
"my_synonym_filter"
],
"tokenizer": "ik_max_word"
}
}
},
"number_of_replicas": "2"
}
},
"mappings": {
"properties": {
"score": {
"type": "float"
},
"count": {
"type": "integer"
},
"name": {
"analyzer": "ik_max_word",
"search_analyzer":"my_synonyms",
"type": "text"
},
"id": {
"type": "keyword"
}
}
}
}