Python Elasticsearch

454 阅读11分钟

升级重构公司 notify


升级Python2.7

  • virtualenv 创建环境

virtualenv --system-site-packages your_project -p python2.7

virtualenv --system-site-packages your_project -p python2.7

  • 使用supervisor

创建目录及配置文件

pip install supervisor
echo_supervisord_conf > /etc/supervisord.conf
mkdir /etc/supervisord.d

vim supervisord.conf 编辑文件

[include]
files = /etc/supervisord.d/*.conf

创建一个监听进程

vim /etc/supervisord.d/ainotify.conf

[program:notify]
command=/data/env/notify/bin/python /data/env/notify/bin/aialert_api --config=/etc/aialert/aialert.conf
directory=/
priority=1
numprocs=1
autostart=true
autorestart=true
startretries=2
exitcodes=0
stopsignal=KILL
stopwaitsecs=1
redirect_stderr=true

重新加载 supervisorctl reload

DSL 是什么?

DSL 是 Domain Specific Language 中文翻译为领域特定语言;而与 DSL 相对的就是 GPL,这里的 GPL 并不是我们知道的开源许可证,而是 General Purpose Language 的简称,即通用编程语言,也就是我们非常熟悉的 Objective-C、Java、Python 以及 C 语言等等。

但是在里所说的 DSL 并不是图灵完备的,它们的表达能力有限,只是在特定领域解决特定任务的

而有限的表达能力就成为了 GPL 和 DSL 之间的一条界限。

几个栗子

  • Regex
    • 正则表达式仅仅指定了字符串的 pattern,其引擎就会根据 pattern 判断当前字符串跟正则表达式是否匹配
  • SQL
    • SQL 语句在使用时也并没有真正的执行,我们输入的 SQL 语句最终还要交给数据库来进行处理,数据库会从 SQL 语句中读取有用的信息,然后从数据库中返回使用者期望的结果。
  • HTML & CSS
    • HTML 和 CSS 只是对 Web 界面的结构语义和样式进行描述,虽然它们在构建网站时非常重要,但是它们并非是一种编程语言,正相反,我们可以认为 HTML 和 CSS 是在 Web 中的领域特定语言。

上面的几个例子有着一些共同的特点:

没有计算和执行的概念; 其本身并不需要直接表示计算; 使用时只需要声明规则、事实以及某些元素之间的层级和关系;

总结下来,实现 DSL 总共有这么两个需要完成的工作:

设计语法和语义,定义 DSL 中的元素是什么样的,元素代表什么意思 实现 parser,对 DSL 解析,最终通过解释器来执行

设计原则和妥协 DSL 最大的设计原则就是简单,通过简化语言中的元素,降低使用者的负担;无论是 Regex、SQL 还是 HTML 以及 CSS,其说明文档往往只有几页,非常易于学习和掌握。但是,由此带来的问题就是,DSL 中缺乏抽象的概念,比如:模块化、变量以及方法等。

抽象的概念并不是某个领域所关注的问题,就像 Regex 并不需要有模块、变量以及方法等概念。

由于抽象能力的缺乏,在我们的项目规模变得越来越大时,DSL 往往满足不了开发者的需求;我们仍然需要编程语言中的模块化等概念对 DSL 进行补充,以此解决 DSL 并不是真正编程语言的问题。

在当今的 Web 前端项目中,我们在开发大规模项目时往往不会直接手写 CSS 文件,而是会使用 Sass 或者 Less 为 CSS 带来更强大的抽象能力,比如嵌套规则,变量,混合以及继承等特性。


使用ElasticSearch DSL进行搜索

fingerchou.com/2017/08/13/…

Search主要包括:

  • 查询(queries)
  • 过滤器(filters)
  • 聚合(aggreations)
  • 排序(sort)
  • 分页(pagination)
  • 额外的参数(additional parameters)
  • 相关性(associated)

创建一个查询对象

1 from elasticsearch import Elasticsearch
2 from elasticsearch_dsl import Search

3 client = Elasticsearch()
4 s = Search(using=client)

ElasticSearch 查询 搜索API

不同于SQL语言,对ElasticSearch引擎发送的查询请求,有两种方式:第一种方式是使用RESTful 风格的API请求对数据进行搜索或更新,这意味着,必须使用搜索API向ElasticSearch引擎发起搜索请求;第二种方式是使用Qeury DSL,将查询语言封装成JSON结构,在JSON结构中,封装查询请求的参数,作为请求主体(Request Body),发送给ElasticSearch引擎处理。

DSL是领域专用语言(Domain-Specific Language)的首字母缩写,是一种通用的大数据查询语言,用于实现海量数据的检索分析。

约定格式

在《ElasticSearch查询》系列文章中,为了简化描述,突出重点,约定将URL字符串中host:port/index/type 省略

curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=user:kimchy'

简写为只包含“HTTP动词+端点+查询参数”的简写格式,如下:

GET /_search?q=user:kimchy

将带有POST请求主体的查询,如下:

curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}'

二,查询端点(Endpoint)

查询端点允许RESTful API或客户端查询ElasticSearch引擎中存储的数据,通过HTTP动词定义操作,通过URI定位数据资源。

1,用于搜索数据的端点

查询ElasticSearch引擎,主要使用_search 和_query端点,_search端点允许执行搜索查询,返回查询结果。在_search端点上,能够执行RESTful API查询和Qeury DSL查询,例如一下脚本:

GET /_search?q=user:kimchy
GET /_search -d
{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

ElasticSearch的所有查询请求都发送到_search端点,对于_query端点,只用于将查询的结果删除:

DELETE /_query?q=user:kimch

2,分析端点(_analyze)

分析端点_analyze,用于对查询参数进行分析,并返回分析的结果

POST /_analyze?field=title -d
ElasticSearch Sever

3,计数端点(_count)

在计数端点_count上,执行查询,获取满足查询条件的文档数量

GET /_count?q=user:jim

4,解释端点(_explain)

用于验证指定的文档是否满足查询条件,格式是index/type/_id/_explain,例如

GET index/type/1/_explain?q=message:search

三,根据文档标识ID搜索单个文档

根据文档标识符搜索文档时,使用“index/type/_id” 格式,如下,搜索文档标识为13的文档

GET /13

四,检查是否有文档满足查询条件

GET 123.59.116.222:9200/alerts_dev/alerts/_search/exists?pretty&q=created_at:"2017-02-12 06:35:47"

五,URI搜索

请求参数位于_search端点之后,参数之间使用&分割,例如:

GET /_search?pretty&q=title:azure&explain=true&from=1&size=10&sort=title:asc&fields:user,title,content

1,pretty参数

默认情况下,API返回的JSON对象忽略换行符,在请求(Request)中加上pretty参数,强制ElasticSearch引擎在响应(Response)中加上换行符,使返回的结果集JSON可读。

2,查询条件(q)参数

查询条件(q)参数用于指定返回的文档必须匹配的查询条件,例如:q=title:azure,指定搜索title字段中包含azure关键字的文档;

可以设置一个字段包含多个关键字,关键字之间使用空格或逗号分隔,例如:q=title:(azure,aws,cloud),或 q=title:(azure aws cloud),指定搜索title字段中包含azure,aws或cloud的文档;只要title字段包含任意一个关键字,文档就满足查询条件; q参数可以指定搜素一个短语,短语使用双引号标识,例如:q=title:"azure vs aws",指定搜索title中包含短语“azure vs aws”的文档;

在查询条件中,也可以指定操作符:+或-,操作符 + 用于指定返回的文档必须匹配查询条件;操作符 - 用于指定返回的文档不匹配查询条件;操作符之间以空格分隔,操作符是位于查询条件=号右侧,字段前面,例如 q=+title:azure -title:aws,指定搜索字段title中只能包含azure,不能包含aws;

3,默认操作符(default_operator)参数

在API中可以包含多个查询条件q,默认条件下,多个查询条件之间的关系是或(or)关系,例如:q=title:azure&q=content:azure,指定搜索title字段中包含azure关键字,或者content字段中包含azure关键字的文档。

查询条件之间的逻辑关系由默认操作符(default_operator)参数指定,默认值是or,该属性可以设置为and 或 or;

当设置为or时,只要一个查询条件(q)满足,就返回文档;例如:q=title:azure&q=content:azure&default_operator=or 当设置为and时,所有的查询条件都满足时,才返回文档;例如:q=title:azure&q=content:azure&default_operator=and 对于查询:q=title:(azure,aws)&q=content:(azure,aws),表示搜索文档的字段title或content,只要字段值中出现azure 或 aws关键字,就表示该文档匹配查询条件,作为查询结果返回。

4,投影字段(fields)参数

默认情况下,返回的每个文档都包括_index,_type,_id,_score和_source字段,投影参数 fields 用于指定返回的字段列表。在查询时,通过fields参数,指定一个以逗号分隔的字段列表,这些字段的store属性必须设置为true,或存在于_source字段中。默认情况下,fields字段的参数值是_source。可以指定一个或多个字段,字段之间以逗号分隔:

fields=title fields=title,user

123.59.116.222:9200/alerts_dev/alerts/_search?pretty&q=created_at:("2017-02-12 06:35:47",)&source:"zabbix"&fields=title,ip,id,created_at

5,排序(sort)参数

排序(sort)参数,用于对结果进行排序,使ElasticSearch按照指定的字段对结果进行排序,值是fieldName:asc/fieldName:desc,默认是升序排序,可以有多个排序字段,排序字段之间以逗号分割,例如:sort=field1:asc,field:desc

6,其他参数

解释(explain)参数:设置为true时,ElasticSearch将在结果中的文档中包含额外的解释信息; 分页(from和size)参数,用于指定结果窗口,from参数指定结果从哪个记录开始返回,默认值是0;size参数定义了返回结果的最大文档数量,默认值是10,参数示例:from=10&size=15 小写词条(lowercase_expanded_terms)参数:自动将词条转换成小写,默认值是true; 分析通配符(analyze_wildcard)参数:通配符或前缀是否被分析,默认值是false

123.59.116.222:9200/alerts_dev/alerts/_search?q=from=1&size=1

六,查询请求

搜索API可以转换为查询请求,如下代码,查询请求的查询条件是词条查询,查询参合URI搜索的参数是对应的:

GET /_search -d 
{  
   "from":0,
   "size":10,
   "sort":[  
      {"post_date":{"order":"asc"}},
      { "name":"desc" }
   ],
   "fields":[ "name","postDate","age"],
   "query":{  
      "term":{ "user":"kimchy"}
   }
}

1,查询条件

在查询条件结点"query"中,指定查询的类型是词条(Term),在词条中指定查询的条件,例如,只要User中包含kimchy关键字,就满足查询条件:

"query" : {
        "term" : { "user" : "kimchy" }
}

2,排序

排序sort字段指定排序的字段及其排序的方向,并且排序值(Sort Value)作为查询结果返回:

"sort":[  
   {   "post_date":{   "order":"asc" }},
   {   "name":"desc"  }
]

排序的方向:升序asc,降序desc,对于_score字段,默认的排序方式是降序desc,对于其他字段,默认的排序方向是asc。

当对字符串字段进行排序时,该字段最好不被分词(analyzed或tokenized),如果字符串字段被分析,那么ElasticSearch引擎将随机选取字段的一个分词(Term)进行排序,这可能不是你想要的排序值

3,投影,选取返回的字段

投影字段(fields),用来限制返回的字段,该字段必须存储在倒排索引中,也就是说,在索引映射中,该字段的store属性为ture。推荐使用_source字段,从文档源数据中,指定需要返回的字段。示例,使用_source 字段,控制结果hits数组中,每个文档_source字段必须返回的字段

{
    "_source": {
        "include": [ "filed1", "field2" ],
        "exclude": [ "field3" ]
    },
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

4,窗口字段

窗口字段 from 和 size,用来限制返回的文档数量

elasticsearch的API搜索简单入门

elasticsearch排序

字符串参数排序

字符查询也支持自定义排序,在查询字符串使用sort参数就可以:

GET /_search?sort=date:desc&sort=_score&q=search

为多值字段排序

在为一个字段的多个值进行排序的时候, 其实这些值本来是没有固定的排序的-- 一个拥有多值的字段就是一个集合, 你准备以哪一个作为排序依据呢?

对于数字和日期,你可以从多个值中取出一个来进行排序,你可以使用min, max, avg 或 sum这些模式。

比说你可以在 dates 字段中用最早的日期来进行排序:

"sort": { "dates": { "order": "asc", "mode": "min" } } 

排序

首先,在每个结果中增加了一个 sort 字段,它所包含的值是用来排序的。

在这个例子当中 date字段在内部被转为毫秒,即长整型数字1411516800000等同于日期字符串 2014-09-24 00:00:00 UTC。