python elasticsearch环境搭建详解


Posted in Python onSeptember 02, 2019

windows下载zip

linux下载tar

下载地址:https://www.elastic.co/downloads/elasticsearch

解压后运行:bin/elasticsearch (or bin\elasticsearch.bat on Windows)

检查是否成功:访问 http://localhost:9200

linux下不能以root用户运行,

普通用户运行报错:

java.nio.file.AccessDeniedException

原因:当前用户没有执行权限

解决方法: chown linux用户名 elasticsearch安装目录 -R

例如:chown ealsticsearch /data/wwwroot/elasticsearch-6.2.4 -R

PS:其他Java软件报.AccessDeniedException错误也可以同样方式解决,给 执行用户相应的目录权限即可

2|0代码实例

如下的代码实现类似链家网小区搜索功能。

从文件读取小区及地址信息写入es,然后通过小区所在城市code及搜索关键字 匹配到对应小区。

代码主要包含三部分内容:

1.创建索引

2.用bulk将批量数据存储到es

3.数据搜索

注意:

代码的es版本交低2.xx版本,高版本在创建的索引数据类型有所不同

#coding:utf8
from __future__ import unicode_literals
import os
import time
import config
from datetime import datetime
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk

class ElasticSearch():
  def __init__(self, index_name,index_type,ip ="127.0.0.1"):
    '''
    :param index_name: 索引名称
    :param index_type: 索引类型
    '''
    self.index_name =index_name
    self.index_type = index_type
    # 无用户名密码状态
    #self.es = Elasticsearch([ip])
    #用户名密码状态
    self.es = Elasticsearch([ip],http_auth=('elastic', 'password'),port=9200)
  def create_index(self,index_name="ftech360",index_type="community"):
    '''
    创建索引,创建索引名称为ott,类型为ott_type的索引
    :param ex: Elasticsearch对象
    :return:
    '''
    #创建映射
    _index_mappings = {
      "mappings": {
        self.index_type: {
          "properties": {
            "city_code": {
              "type": "string",
              # "index": "not_analyzed"
            },
            "name": {
              "type": "string",
              # "index": "not_analyzed"
            },
            "address": {
              "type": "string",
              # "index": "not_analyzed"
            }
          }
        }

      }
    }
    if self.es.indices.exists(index=self.index_name) is True:
      self.es.indices.delete(index=self.index_name)
    res = self.es.indices.create(index=self.index_name, body=_index_mappings)
    print res

  def build_data_dict(self):
    name_dict = {}
    with open(os.path.join(config.datamining_dir,'data_output','house_community.dat')) as f:
      for line in f:
        line_list = line.decode('utf-8').split('\t')
        community_code = line_list[6]
        name = line_list[7]
        city_code = line_list[0]
        name_dict[community_code] = (name,city_code)

    address_dict = {}
    with open(os.path.join(config.datamining_dir,'data_output','house_community_detail.dat')) as f:
      for line in f:
        line_list = line.decode('utf-8').split('\t')
        community_code = line_list[6]
        address = line_list[10]
        address_dict[community_code] = address

    return name_dict,address_dict

  def bulk_index_data(self,name_dict,address_dict):
    '''
    用bulk将批量数据存储到es
    :return:
    '''
    list_data = []
    for community_code, data in name_dict.items():
      tmp = {}
      tmp['code'] = community_code
      tmp['name'] = data[0]
      tmp['city_code'] = data[1]
      
      if community_code in address_dict:
        tmp['address'] = address_dict[community_code]
      else:
        tmp['address'] = ''

      list_data.append(tmp)
    ACTIONS = []
    for line in list_data:
      action = {
        "_index": self.index_name,
        "_type": self.index_type,
        "_id": line['code'], #_id 小区code
        "_source": {
          "city_code": line['city_code'],
          "name": line['name'],
          "address": line['address']
          }
      }
      ACTIONS.append(action)
      # 批量处理
    success, _ = bulk(self.es, ACTIONS, index=self.index_name, raise_on_error=True)
    #单条写入 单条写入速度很慢
    #self.es.index(index=self.index_name,doc_type="doc_type_test",body = action)

    print('Performed %d actions' % success)

  def delete_index_data(self,id):
    '''
    删除索引中的一条
    :param id:
    :return:
    '''
    res = self.es.delete(index=self.index_name, doc_type=self.index_type, id=id)
    print res

  def get_data_id(self,id):
    res = self.es.get(index=self.index_name, doc_type=self.index_type,id=id)
    # # 输出查询到的结果
    print res['_source']['city_code'], res['_id'], res['_source']['name'], res['_source']['address']

  def get_data_by_body(self, name, city_code):
    # doc = {'query': {'match_all': {}}}
    doc = {
      "query": {
        "bool":{
          "filter":{
            "term":{
            "city_code": city_code
            }
          },
          "must":{
            "multi_match": {
              "query": name,
              "type":"phrase_prefix",
              "fields": ['name^3', 'address'],
              "slop":1,
              
              }

          }
        }
      }
    }
    _searched = self.es.search(index=self.index_name, doc_type=self.index_type, body=doc)
    data = _searched['hits']['hits']
    return data
     

if __name__=='__main__':
  #数据插入es
  obj = ElasticSearch("ftech360","community")
  obj.create_index()
  name_dict, address_dict = obj.build_data_dict()
  obj.bulk_index_data(name_dict,address_dict)

  #从es读取数据
  obj2 = ElasticSearch("ftech360","community")
  obj2.get_data_by_body(u'保利','510100')

以上就是全部知识点内容,感谢大家的阅读和对三水点靠木的支持。

Python 相关文章推荐
python练习程序批量修改文件名
Jan 16 Python
python 编程之twisted详解及简单实例
Jan 28 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
python决策树之C4.5算法详解
Dec 20 Python
PyCharm代码回滚,恢复历史版本的解决方法
Oct 22 Python
Python选择网卡发包及接收数据包
Apr 04 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
Aug 05 Python
10个Python面试常问的问题(小结)
Nov 20 Python
Python tkinter和exe打包的方法
Feb 05 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
May 07 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 Python
Python 制作自动化翻译工具
Apr 25 Python
关于pymysql模块的使用以及代码详解
Sep 01 #Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 #Python
Python 使用多属性来进行排序
Sep 01 #Python
详解一种用django_cache实现分布式锁的方式
Sep 01 #Python
python实现多进程通信实例分析
Sep 01 #Python
python输出带颜色字体实例方法
Sep 01 #Python
基于Django框架的权限组件rbac实例讲解
Aug 31 #Python
You might like
PHP引用符&的用法详细解析
2013/08/22 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
php中请求url的五种方法总结
2017/07/13 PHP
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
微信小程序页面间跳转传参方式总结
2019/06/13 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
初步解析Python中的yield函数的用法
2015/04/03 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
如何删除一个表里面的重复行
2013/07/13 面试题
服务之星获奖感言
2014/01/21 职场文书
五型班组建设方案
2014/02/10 职场文书
模范教师事迹材料
2014/02/10 职场文书
爽歪歪广告词
2014/03/20 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
MySQL库表名大小写的选择
2021/06/05 MySQL
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers