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实现删除文件与目录的方法
Nov 10 Python
Python中实现三目运算的方法
Jun 21 Python
Python实现包含min函数的栈
Apr 29 Python
python生成随机图形验证码详解
Nov 08 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
django中的HTML控件及参数传递方法
Mar 20 Python
python实现石头剪刀布程序
Jan 20 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
python求平均数、方差、中位数的例子
Aug 22 Python
python中p-value的实现方式
Dec 16 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 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随机生成随机个数的字母组合示例
2014/01/14 PHP
php实现无限级分类
2014/12/24 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
使用js画图之饼图
2015/01/12 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
Python脚本实现下载合并SAE日志
2015/02/10 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
详解Python的Lambda函数与排序
2016/10/25 Python
python之PyMongo使用总结
2017/05/26 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
使用python3实现操作串口详解
2019/01/01 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
10张动图学会python循环与递归问题
2021/02/06 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
《鲁班和橹板》教学反思
2014/04/27 职场文书
北京奥运会主题口号
2014/06/13 职场文书
毕业大学生自荐信
2014/06/17 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python