Elasticsearch7.6 之地址解析案例

一、背景

公司内部网络, 内部物流系统提出需求,通过用户任意输入的地址,自动解析出"省份"-“地市”-“区县”,以及对应的区划代码。

问题分析:

  1. 用户输入地址信息并不标准,无法直接通过数据库检索
  2. 处于内网,无法直接通过互联网获取解析结果
  3. 需要最新的区划数据
    针对以上场景,解决办法就是搭建一个内部的地址解析环境

方案:

1.爬取最新的区划数据
2.使用Elasticsearch7.6,+IK分词器 ,对区划数据做索引文档。并封装调用接口,开放使用。

二、区划数据获取

参考
链接: Python 爬虫 中国行政区划信息爬取.

三、数据准备和写入

平时寄送快递的习惯都会要输入:省市区县+地址信息,因此创建的地址索引内容 也应该包含基础的省市区县甚至街道信息。事例中的地址名称都是标准的行政区划中的名称,也是我们从数据库中获取的数据。
eg:
山东省(省)淄博市(市)沂源县(区县)南鲁山镇(乡镇)平地村委会(村)

 最终封装后的数据模型如下:
              { "address": "山东省淄博市沂源县南鲁山镇上土门村委会",
                "country": "China",
                "countrycode": "0",
                "province": "山东省",
                "provincecode": "370000",
                "city": "淄博市",
                "citycode": "370300",
                "district": "沂源县",
                "districtcode": "370323",
                "xiang": "南鲁山镇",
                "xiangcode": "370323111000",
                "cun": "上土门村委会",
                "cuncode": "370323111213"
                }
向ES 写入的数据时,就是对address字段做分词索引,实现模糊查询。

3.1 创建索引库

根据数据模型,创建索引库如下: http://127.0.0.1:9200/area_index

{
    "settings":{
        "number_of_shards":1,
        "number_of_replicas":0
    },
    "mappings":{
         "properties":{
                "address":{"type":"text", "analyzer":"ik_smart"},
                "country":{"type":"text"},
                "countrycode": {"type":"text"},
                "province":{"type":"text"},
                 "provincecode": {"type":"text"},
                "city":{"type":"text"},
                "citycode": {"type":"text"},
                "district":{"type":"text"},
                "districtcode": {"type":"text"},
                "xiang":{"type":"text"},
                "xiangcode": {"type":"text"},
                "cun":{"type":"text"},
                "cuncode": {"type":"text"}
        }  
    }

}

分词模式使用 ik_smart ,不要使用ik_max_word(拆分的太细了),也只用对address字段做分词。

3.2 数据写入

地址信息数据提前已经导入到了数据库,根据区划的父子关系封装为 (省)-(市)-(区县)南鲁-(乡镇)-(村) 类型的基础视图,这里使用Python脚本将数据从数据库写入到ES中
相关依赖:elasticsearch,sqlalchemy,cx_Oracle

3.2.1 数据库连接脚本

文件名:OracleDb.py


from sqlalchemy import create_engine
from sqlalchemy import MetaData,Table
from sqlalchemy.orm import sessionmaker


class OracleDb:
    def __init__(self, url):
        self.__url = url
        self.__engine = create_engine("oracle://" + url + "")
        self.__session = sessionmaker(self.__engine)


    def findAll(self,mapper):
        db_session = self.__session()
        list= db_session.query(mapper).all()
        db_session.close()
        return list

3.2.2 ES连接

文件名: EsConnect.py

from elasticsearch import Elasticsearch

class EsConn:

    def __init__(self,ip,port):
        self.__ip=ip
        self.__port=port
        self.__db=Elasticsearch([{'host':ip,'port':port}])

    @property
    def db(self):
        return self.__db

3.2.3 ORM映射

t_mv_areainfo_china表,我本地转化好待插入的数据, mapper.py 中的一个对象TMvAreainfoChina,
注:t_mv_areainfo_china 必须得有主键,该文件 通过sqlacodegen.main 生成,其中的getDic()方法自己封装,导入ES时有用。

文件名:mapper.py

# coding: utf-8
from sqlalchemy import Column, DateTime, VARCHAR,CHAR
from sqlalchemy.dialects.oracle import NUMBER
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.dialects.oracle import RAW
Base = declarative_base()
metadata = Base.metadata

class TMvAreainfoChina(Base):
    __tablename__ = 't_mv_areainfo_china'

    rid = Column(VARCHAR(64), primary_key=True)
    id = Column(VARCHAR(320))
    address = Column(VARCHAR(1000))
    country = Column(CHAR(5))
    countrycode = Column(CHAR(1))
    province = Column(VARCHAR(200))
    provincecode = Column(VARCHAR(64))
    city = Column(VARCHAR(200))
    citycode = Column(VARCHAR(64))
    district = Column(VARCHAR(200))
    districtcode = Column(VARCHAR(64))
    xiang = Column(VARCHAR(200))
    xiangcode = Column(VARCHAR(64))
    cun = Column(VARCHAR(200))
    cuncode = Column(VARCHAR(64))

	#插入ES时需要转为为标准字典格式,自己封装
    def getDict(self):
        return {
            "id":self.id,
            "address" : self.address,
            "country" : self. country,
            "countrycode" : self.countrycode,
            "province" : self.province,
            "provincecode" : self.provincecode,
            "city" : self.city,
            "citycode" : self.citycode,
            "district" : self.district,
            "districtcode" : self.districtcode,
            "xiang" : self.xiang,
            "xiangcode" : self.xiangcode,
            "cun" : self. cun,
            "cuncode"  : self.cuncode
        }

3.2.4 导入数据

from OracleDb import OracleDb
from EsConnect import EsConn
from elasticsearch import helpers
from mapper import TMvAreainfoChina
cnn=OracleDb('用户名:密码@ip:1521/实例')


AreainfoChina =TMvAreainfoChina
areainfos = cnn.findAll(AreainfoChina )
es = EsConn('127.0.0.1', 9200).db
#批量导入方法
def bulk(es,datalist,index):
    action = ({
        "_index": index,
        "_id": item.id,
        "_source": item.getDict()
    } for item in datalist)
    #print(action.__next__())
    helpers.bulk(es, action)


bulk(es,areainfos,'area_index')
print("******************* end")

导入成功后:测试
在这里插入图片描述

四,这还没完

不要以为这就万事大吉了。实际使用中,解析常常南辕北辙要提高解析准确度,还要对索引做进一步优化

4.1 ik分词库扩展

将所有的地址数据生成dic文件,比如湖北省、湖北、襄阳市、襄阳、东港区、东港 等等,竟可能全面,避免出现错误解析,ik分词的配置略,配置完后需要重新导入数据。
eg:

在这里插入图片描述

在这里插入图片描述

4.2 接口算法优化

ik分词优化后可以提高至少50%解析正确率,要进一步提高准确率,可以提前分词中省、市关键字,对解析出来的结果做进一步过滤。

五 遗留

目前地址解析成功率在80%,主要是用户输入的地址信息并不标准,想要更准确要需要思考更多的办法,笔者对Elasticsearch7.6 使用很少,还望指点。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Elasticsearch是一个开源的搜索引擎,它可以解决在大规模数据集中进行快速和准确的搜索和分析的问题。而Elasticsearch7.6Elasticsearch的一个版本,在它的更新中修复了一些问题和增加了一些功能。 在Mac上下载Elasticsearch7.6很简单,只需要执行以下步骤: 首先,在Elasticsearch官网下载网址(https://www.elastic.co/downloads/elasticsearch)中选择MAC OS X的操作系统。 其次,选择相应的Elasticsearch版本7.6,然后单击“Download”按钮。 下载完成后,将压缩文件解压缩到计算机的某个位置。 接下来,让终端进入到解压文件的bin目录,使用./elasticsearch启动Elasticsearch。 最后,打开浏览器,访问http://localhost:9200/,可以查看到Elasticsearch正在运行,并可以开始使用Elasticsearch。 这就是在Mac上下载Elasticsearch7.6的步骤。需要注意的是,对于初学者来说,熟悉Elasticsearch的使用和配置需要花费一定的时间和精力,所以建议多查找资料和实践。 ### 回答2: 要在Mac上下载Elasticsearch7.6,您可以使用Homebrew,这是Mac操作系统的软件包管理器。要使用Homebrew安装Elasticsearch7.6,首先需要安装Homebrew。您可以在终端中执行以下命令来安装Homebrew: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 安装Homebrew后,您可以在终端中执行以下命令来安装Elasticsearch7.6: brew tap elastic/tap brew install elastic/tap/elasticsearch-full@7.6 成功安装Elasticsearch7.6后,您可以使用以下命令启动Elasticsearchelasticsearch 现在您可以打开浏览器,输入http://localhost:9200来验证安装是否成功。如果一切顺利,您将看到Elasticsearch的欢迎页面。现在您就可以开始使用Elasticsearch7.6来进行全文搜索和分析。 ### 回答3: 要在Mac上下载elasticsearch7.6,有几个步骤需要遵循。 首先,你需要确认你的Mac符合要求,包括Java版本(至少是Java 8)和内存(至少4GB RAM)。 接着,在elastic官网上下载elasticsearch7.6的zip包(elasticsearch-7.6.0-darwin-x86_64.tar.gz)。下载完成后,你需要解压这个zip包并将其重命名为elasticsearch。 在解压并重命名完毕后,你需要在命令行(Terminal)输入以下命令,来启动elasticsearch: cd <path_to_elasticsearch_directory> bin/elasticsearch 这些步骤完成后,elasticsearch将会开始运行。你可以通过打开浏览器并输入http://localhost:9200来访问elasticsearch的控制台来验证 elasticsearch是否成功启动。 最后,你还可以通过下载和安装Kibana,来拓展elasticsearch的功能。Kibana是一款便捷的web应用程序,可以帮助你可视化、搜索和分析elasticsearch的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值