冯龙宇的技术专栏 NLP and ML Coder

Elasticsearch使用心得

2020-10-01
fly

NLP

最近的智能政务对话项目,中涉及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"
                        }
            }
      }
}

ES同义词建立过程中注意点,在指定位置建立同义词文件,一个注意点,词典中包含同义词所有词,stopwords 中不包含同义词中所有词,这点不满足,建立mapping无法成功


Similar Posts

Comments