es 中 指定某个字段为空 必须用missing

\”must_not\”:[{\”missing\”:{\”field\”:\”gongqiu.tags\”}}]

配置 :  默认搜索和创建索引的分词算法:   index.analysis.analyzer.default.type : “mmseg”

010  63005005

索引分片数:   index.number_of_shards: 5
索引副本数:   index.number_of_replicas: 1

type:  创建类型
as:  “company.id”
analyzer:  指定分词
boost:  查询权重
char_filter => [“html_strip”]  过滤掉html字符
source:    通过 includes包含创建索引的时候自动创建指定的字段,而exclueds就是排除某些字段,其余的字段自动创建索引
parent:    http://log.medcl.net/item/2011/10/diving-into-elasticsearch-8-parent-child-feature-uses/
ttl :    索引生存时间,超过时间后,这索引会被删掉,如果不通过default指定,那么不回被删除
index:  指定是否分词,如果分词,指定用什么分词,可以包含 not_analyzed,  no,   analyzed, analyzed_no_norms, not_analyzed_no_norms. not_analyzed是不分词,no是不会被查到, analyzed是指具体的分词,如mmseg等, ANALYZED_NO_NORMS,分词索引,不存储NORMS;not_analyzed_no_norms,不分词,索引,不存储 NORMS,NORMS存储了boost所需信,默认是配置文件中指定的分词,这里没有指定的话,则不分词。
store: 包括yes和no和compress,yes为存储,no为不存储,COMPRESS为压缩存储,用于长文本或二进制,但性能受损
term_vector: http://blog.sina.com.cn/s/blog_6d01e21a0101iq4z.html
include_in_all:  制定是否包含到_all字段,默认自动包含

指定分词的情况下,对该词进行分词
http://218.240.21.106:9200/jobs/_analyze?analyzer=mmseg&text=%E4%B8%9C%E8%BD%AF

query

一旦使用search,必须至少提供query参数,然后在这个query的基础上进行接下来其他的检索。query参数又分三类:

“match_all” : { } 直接请求全部;
“term”/”text”/”prefix”/”wildcard” : { “key” : “value” } 根据字符串搜索(严格相等/片断/前缀/匹配符);
terms :   精确匹配多个关键字,eg:   curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {terms: {name: [“zhang”, “zhangcaiyan”]} }} }’
term 是严格相等的查询,例如我查找中国人民,那么他就是使用中国人民去查询
text   是片段查询,例如我同样查找中国人民,那么他有可能是用中国  人民  去查询
query_string :

“range” : { “@timestamp” : { “from” : “now-1d”, “to” : “now” } } 根据范围搜索,如果type是时间格式,可以使用内置的now表示当前,然后用-1d/h/m/s来往前推,参数有from、 to、  include_lower、  include_upper、gt、gte、lt、lte。
“range” : { “age” : { “from” : 10, “to” : 20 } }

match  完全匹配,使用的时候,可以使用operator来指定是and  和  or,默认是or,例如下面 _all字段中必须同时含有zcy和z的数据,才可以被查出来
curl -XGET http://localhost:9200/infos/_search?pretty=true -d ‘{query: {match: {_all: {query: “zcy z”, operator: “and”}}} }’
curl -XGET http://localhost:9200/infos/_search?pretty=true -d ‘{query: {match: {_all: “zcy z”} } }’
match:  好像和text是一样的
multi_match:  通过fields可以指定多个字段去匹配内容
curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {multi_match: { query: “zcy z”, fields: [“name”, “desc”] }} }’

bool: must和must_not和should,通过must指定必须符合的条件,must_not指定必须不符合的条件,should  是指可以符合某个条件,这三个是可以结合使用,我们总会遇到一些这样的需求,必须。。。,或者可以。。。。,没有出现也没关系,出现的话就索引出来。

curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {bool: { must: {term: {name: “zcy”}}  }} }’

ids:  id查询,curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {ids: { values: [“2”, “3”, “31”, “50”]  }} }’

filter 过滤,这个查询很快,因为不需要执行打分过程,上面提到的query的参数,在filter中也都存在。此外,还有比较重要的参数就是连接操作:  curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {wildcard: { name: “*z*” }}, filter: {range: {id: {from: 1, to: 10}} } }’

“or”/”and” : [{“range”:{}}, {“prefix”:””}] 两个filter的查询,交集或者合集;
“bool” : [“must”:{},”must_not”:{},”should”:{}] 上面的and虽然更快,但是只能支持两个,超过两个的,要用 bool 方法;
“not”/”limit” : {} 取反和限定执行数。注意这个limit和mysql什么的有点不同:它限定的是在每个上执行多少条。如果你有5个,其实对整个index是limit了5倍大小的设定值。

另一点比较关键的是:filter结果默认是不缓存的,如果常用,需要指定 “_cache” : true。

fuzzy: 模糊查询, 和min_similarity配合使用,当查找的数据是数字时,min_similarity可以指定数字,表示在该数字增加或减小这个值的范围内的查 询,例如: curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {fuzzy: {age: {value: 10, min_similarity: 9 } }} }’,如果查找的是日期,那么min_similarity指定的是日期,这个日期代表查找该日期的上下浮动范围。例如:  curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {fuzzy: {created_at: {value: “2013-05-07”, min_similarity: “2d” } }} }’,如果是查找的是字符串,那我就不知道是啥意思了

query_string:   查询,这种查询非常灵活,可以match/text、wildcard查询,wildcard通配符查询,可以通过参数 allow_leading_wildcard来实现,这个参数默认为true。    详情见http://www.elasticsearch.cn/guide/reference/query-dsl/query-string- query.html, 拥有参数 fields, query  、default_field、 default_operator(默认or),eg: curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {query_string: { fields: [“name”], query: “z* zhang”, default_operator: “and”  } } }’

filtered: 过滤查询,参数有query和filter,filter中有and、or、bool、not等,and和or里有filters参数,通过range和 prefix指定过滤条件。  http://www.elasticsearch.cn/guide/reference/query-dsl/filtered-query.html
eg:    and:     curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {filtered: {query: {wildcard: {_all: “*”}}, filter:{and: [{prefix: {name: “zhangcaiyan”}}]}  }}}’
bool:    curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {filtered: {query: {wildcard: {_all: “*zhang*”}}, filter:{bool: {must: {term: {name: “zhang”}}} }  }}}’
not:     curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {filtered: {query: {wildcard: {_all: “*zhang*”}}, filter:{ not: {prefix: {name: “z”}} }}}}’
numeric_rage:        curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {filtered: {query: {wildcard: {_all: “*zhang*”}}, filter:{ numeric_range:{age: {from: 10, to: 20} }  }}}}’
or:    curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {filtered: {query: {wildcard: {_all: “*”}}, filter:{or: [{prefix: {name: “zhangcaiyan”}}]}  }}}’
prefix:     curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {filtered: {query: {wildcard: {_all: “*zhang*”}}, filter:{ not: {prefix: {name: “z”}} }}}}’
range:       curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {filtered: {query: {wildcard: {_all: “*zhang*”}}, filter:{ range: {age: {from: “10”}} }}}}’,   “range” : { “@timestamp” : { “from” : “now-1d”, “to” : “now” } } 根据范围搜索,如果type是时间格式,可以使用内置的now表示当前,然后用-1d/h/m/s来往前推,参数有from、 to、  include_lower、  include_upper、gt、gte、lt、lte。
term:        curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {constant_score: {filter: {term: {name: “zhang”}}} }}’

facets

facets接口可以根据query返回统计数据,最基础的是terms和statistical两种。不过在日志分析的情况下,最常用的是:

“histogram” : { “key_field” : “”, “value_field” : “”, “interval” : “” } 根据时间间隔返回柱状图式的统计数据;
“terms_stats” : { “key_field” : “”, “value_field” : “” } 根据key的情况返回value的统计数据,类似group by的意思。

curl -XGET http://localhost:9200/jobs/_search?pretty=true -d'{“facets”: {“cate”: {“terms”: {“field”: “region_id”} } }}’

这里就涉及到前面mapping里为什么针对每个field都设定type的原因了。因为 histogram 里的 key_field 只能是 dateOptionalTime 格式的,value_field 只能是 string 格式的;而 terms_stats 里的 key_field 只能是 string 格式的,value_field 只能是 numberic 格式的。

而我们都知道,http code那些200/304/400/503神马的,看起来是数字,我们却需要的是他们的count数据,不是算他们的平均数。所以不能由ES动态的认定为long,得指定为string。

SpanFirstQuery仅取在开头部分包含查询词的文档,span_first、 end,  span_term需要满足的查询,end 为integer,决定哪里算开头, eg: curl -XGET http://localhost:9200/infos/_search?pretty=true -d'{query: {span_first: {match: {span_term: {name: “yan”}},end: 3 }} }’

映`射_source和_all
Mappings定义了你的文档如何被索引和存储。你可以,比如说,定义每个字段的类型——比如你的syslog里,消息肯定是字符串,严重性可以是整数。怎么定义映射参见链接。
默认情况下,除了给你所有的字段分别创建索引,elasticsearch还会把他们一起放进一个叫_all的新字段里做索引。好处是你可以在 _all里搜索那些你不在乎在哪个字段找到的东西。另一面是在创建索引和增大索引大小的时候会使用额外更多的CPU。所以如果你不用这个特性的话,关掉 它。即使你用,最好也考虑一下定义清楚限定哪些字段包含进_all里。详见链接。

bin/elasticsearch
bin/elasticsearch -f  前台运行

https://github.com/elasticsearch/elasticsearch-servicewrapper

bin/service/elasticsearch start来运行elasticsearch
bin/service/elasticsearch stop来停止elasticsearch
bin/service/elasticsearch console让elasticsearch在前台运行
bin/service/elasticsearch install让elasticsearch安装为服务
bin/service/elasticsearch remove删除elasticsearch服务

安装为服务以后就可以通过

service elasticsearch start来开启elasticsearch
service elasticsearch restart来重启elasticsearch
service elasticsearch stop来关闭elasticsearch

Es Mapping篇主要是讲解Mapping的一些相关配置与需要注意的地方,说到Mapping大家可能觉得有些不解,其实我大体上可以将Es 理解为一个数据管理平台,那么index 当然就是库了,type可以理解为表,mapping可以理解为表的结构和相关设置的信息(当然mapping有更大范围的意思)。Mapping的作用 域也是从cluster、node、index、type。

每个索引在创建时可以让一个特定的设置项与其关联。

curl -XPUT ‘http://localhost:9200/twitter/’ -d ‘
index :
number_of_shards : 3
number_of_replicas : 2

curl -XPUT ‘http://localhost:9200/twitter/’ -d ‘{
“settings” : {
“index” : {
“number_of_shards” : 3,
“number_of_replicas” : 2
}
}
}’

curl -XPUT ‘http://localhost:9200/twitter/’ -d ‘{
“settings” : {
“number_of_shards” : 3,
“number_of_replicas” : 2
}
}’

你不需要在 settings 项中显示的指定number_of_shards index

更新索引设置 :

curl -XPUT ‘localhost:9200/twitter/_settings’ -d ‘{
“index” : {
“number_of_replicas” : 1
}
}’

查看索引设置: curl -XGET ‘localhost:9200/twitter/_settings’

删除索引:
curl -XDELETE http://localhost:9200/blog

关闭和打开索引:

curl -XPOST ‘http://localhost:9200/blog/_close’

curl -XPOST ‘http://localhost:9200/blog/_open’

7 获取mapping

curl -XGET ‘http://localhost:9200/blog/_mapping?pretty=true’         # 获取一个索引上定义的mapping

curl -XGET ‘http://localhost:9200/blog/topic/_mapping?pretty=true’   # 获取一个类型上定义的mapping

curl -XGET ‘http://localhost:9200/_mapping?pretty=true’              # 获取所有的mapping定义

8 获取状态

curl -XGET ‘http://localhost:9200/blog/_status?pretty=true’

9 获取统计信息

curl -XGET ‘http://localhost:9200/_stats?pretty=true’

boosting      http://www.elasticsearch.org/guide/reference/query-dsl/boosting-query/
field    http://www.elasticsearch.cn/guide/reference/query-dsl/field-query.html
fuzzy    如果查找的是字符串,那min_similarity是起什么作用的啊
has_child
more_like_this  http://www.elasticsearch.cn/guide/reference/query-dsl/mlt-query.html
more_like_this_field
span_near
span_not
span_or
top_children
nested
custom_filters_score
script     http://www.elasticsearch.cn/guide/reference/query-dsl/script-filter.html

@gongqius = Gongqiu.tire.search(page: (params[:page] || 1), per_page: params[:per_page] || 20) do |search|

if @keywords.present?
search.query do  |q|
q.string @keywords
end
end

# s = Tire.search(‘articles’) { query { string ‘title:T*’ } }
# s.filter :terms, :tags => [‘ruby’]
# p s.results
# p s.to_curl

# 某种条件下的总数,可以指定and或or,and为多个条件并且,or为或
# key = “xinxi_status_id”
# temp_hash = {“facet_filter”=>{“and”=>[
#   {“terms”=>{:category_id=>[8]}},
#   {“terms”=>{:price_unit_id=>[1]}}
# ]}}
# search.facet(key, temp_hash) do |facet|
#   facet.terms key, size: 20
# end

# search.filter :terms, {xinxi_status_id: [1,2,3], name: [“11”]}   过滤

# search.sort{by :name, ‘desc’}    查找排序

search.query do  |q|
q.string “name:#{@keywords}”
end if nil

search.query do  |q|
q.string @keywords
end if nil

search.query do  |query|
query.boolean do |b|
if @keywords.present?
b.must {|tm| tm.string @keywords }
# b.must_not
# b.should
end
end
end if nil # bool

if nil
if  @q.present? || @locations.present?
search.query do  |query|
query.boolean do |b|
if @q.present?
b.must {|tm| tm.string @q }
end

if @locations.present?
b.must {|tm| tm.string (“region:”+@locations) }
end
end
end
end

search.highlight :description=>{“fragment_size” => 180, “number_of_fragments” => @filter_hash[:id].present? ? 0 : 1 },
:name=>{“number_of_fragments” => 0},
:company_name=>{“number_of_fragments” => 0},
:region=>{“number_of_fragments” => 0},
:industries_text=>{“number_of_fragments” => 0},
:company_type=>{“number_of_fragments” => 0},
:degree=>{“number_of_fragments” => 0},
:job_class=>{“number_of_fragments” => 0},
ptions => { :tag => ‘<strong class=”highlight”>’ }

@facet_attributes.keys.each do |key|
search.facet(key.to_s,temp_hash) do |facet|
facet.terms key.to_s,:size=>20
end
end

@filter_hash.each do |key, value|
search.filter :terms, key => value
end

search.sort { by :published_at, ‘desc’ }

end
end

@facets = @gongqius.facets

查找具体的分词结果: http://host:port/index/_analyze?text=someting&analyzer=yourAnalyzer
http://localhost:9200/_plugin/rtf/

One thought on “elasticsearch 使用查询

Comments are closed.