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 03 Python
python实现定时播放mp3
Mar 29 Python
python通过索引遍历列表的方法
May 04 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
python类中super()和__init__()的区别
Oct 18 Python
浅谈Python处理PDF的方法
Nov 10 Python
Python批量发送post请求的实现代码
May 05 Python
Django代码性能优化与Pycharm Profile使用详解
Aug 26 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
django queryset相加和筛选教程
May 18 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 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 错误处理经验分享
2011/10/11 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
Yii框架表单模型和验证用法
2016/05/20 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
php高清晰度无损图片压缩功能的实现代码
2018/12/09 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
Python3 socket同步通信简单示例
2017/06/07 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
Python 实现一个计时器
2020/07/28 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
学校安全检查制度
2014/01/27 职场文书
青春奉献演讲稿
2014/05/08 职场文书
阅兵口号
2014/06/19 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
银行自荐信范文
2015/03/25 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
Java基础——Map集合
2022/04/01 Java/Android