1. 结构化搜索得到的结果只有,没有相似概念。

term可以实现精确值查询

curl -XGET 'localhost:9200/logstash-cowrie/_search?pretty' -d '
{"query":
{ "constant_score":{
"filter":{
"term": {"src_ip": "192.168.188.88"}
}
}
}
}'

因为term是非评分的,所以要用constant_score的方式将其转化为过滤器。注意:如果没有constant_score是会报错的。

查看字段是否可以用精确值查询,可以通过analyze API。下面是例子,可以看到ip只有一个token可以精确查询。

curl -XGET 'localhost:9200/test/_analyze?pretty' -d '{"field":"src_ip","text": "192.168.188.88"}'
#结果
{
"tokens" : [
{
"token" : "192.168.188.88",
"start_offset" : ,
"end_offset" : ,
"type" : "<NUM>",
"position" :
}
]
}

设置字段具有精确值,如果想修改已有字段只能删除后重新建立。例子:

DELETE /my_store 

PUT /my_store
{
"mappings" : {
"products" : {
"properties" : {
"productID" : {
"type" : "string",
"index" : "not_analyzed"
}
}
}
} }

组合过滤:

{
"bool" : {
"must" : [], #与
"should" : [], #或
"must_not" : [], #非
}
}

例子1:

curl -XGET 'localhost:9200/test/_search?pretty' -d '
{"query":
{"constant_score":{
"filter":{
"bool":{
"should":[{"term": {"src_ip": "192.168.188.88"}},{"term": {"src_ip": "1.2.3.4"}}],
"must":{"range":{"timestamp":{"gte":"2016-10-24T00:00:00", "lt":"2017-10-25T00:00:00"}}}
}
}
}
}
}'

注意单个条件和多个条件的写法。

单个条件,直接用 {}

多个条件,用 [{},{}]

注意:https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/combining-filters.html中的例子中用了filtered关键字,该关键字在新版es中已经被废除了。

bool表达式的嵌套

src_ip=192.168.188.88 or (src_ip=1.2.3.4 and 2016-10-24<=time<2017-10-25)

curl -XGET 'localhost:9200/test/_search?pretty' -d '
{"query":
{"constant_score":{
"filter":{
"bool":{
"should":[
{"term": {"src_ip": "192.168.188.88"}},
{"bool":{
"must":
[{"term":{"src_ip": "1.2.3.4"}},
{"range":{"timestamp":{"gte":"2016-10-24T00:00:00", "lt":"2017-10-25T00:00:00"}}}]
}
}]
}
}
}
}
}'

查找多个精确值 terms

{
  "terms": {
  "src_ip": ["1.2.3.4","5.6.7.8"]
}
}

注意,term和terms表示包含,而不是相等

{ "term" : { "tags" : "search" } } 可以匹配下面两个文档

{ "tags" : ["search"] }
{ "tags" : ["search", "open_source"] }

如果想要完全一样,必须用其他字段增加约束。

范围range

"range" : {
"price" : {
"gte" : ,
"lte" :
}
}

日期范围可以在日期上做运算

"range" : {
"timestamp" : {
"gt" : "2014-01-01 00:00:00",
"lt" : "2014-01-01 00:00:00||+1M"
}
}
"range" : {
"timestamp" : {
"gt" : "now-1h"
}
}

字符串范围:(不推荐,会很慢)

range 查询同样可以处理字符串字段, 字符串范围可采用 字典顺序(lexicographically) 或字母顺序(alphabetically)。

  • 5, 50, 6, B, C, a, ab, abb, abc, b  字典范围排序
"range" : {
"title" : {
"gte" : "a",
"lt" : "b"
}
}

数字和日期字段的索引方式使高效地范围计算成为可能。 但字符串却并非如此,要想对其使用范围过滤,Elasticsearch 实际上是在为范围内的每个词项都执行 term 过滤器,这会比日期或数字的范围过滤慢许多。

字符串范围在过滤 低基数(low cardinality) 字段(即只有少量唯一词项)时可以正常工作,但是唯一词项越多,字符串范围的计算会越慢。

存在查询:exists

GET /my_index/posts/_search
{
"query" : {
"constant_score" : {
"filter" : {
"exists" : { "field" : "tags" }
}
}
}
}

缺失查询:missing

GET /my_index/posts/_search
{
"query" : {
"constant_score" : {
"filter": {
"missing" : { "field" : "tags" }
}
}
}
}

注意下面这个例子

{
"name" : {
"first" : "John",
"last" : "Smith"
}
}

查询

{
"exists" : { "field" : "name" }
}

实际执行的是

{
"bool": {
"should": [
{ "exists": { "field": "name.first" }},
{ "exists": { "field": "name.last" }}
]
}
}

这也就意味着,如果 first 和 last 都是空,那么 name 这个命名空间才会被认为不存在。

【ES】学习4-结构化搜索的更多相关文章

  1. ElasticStack学习(九):深入ElasticSearch搜索之词项、全文本、结构化搜索及相关性算分

    一.基于词项与全文的搜索 1.词项 Term(词项)是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term. Term的使用说明: 1)Term Level Query:Ter ...

  2. ElasticSearch常用结构化搜索

    最近,需要用到ES的一些常用的结构化搜索命令,因此,看了一些官方的文档,学习了一下.结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的. 它们都有精确的格式,我们可以对这些数 ...

  3. Elasticsearch结构化搜索与查询

    Elasticsearch 的功能之一就是搜索,搜索主要分为两种类型,结构化搜索和全文搜索.结构化搜索是指有关查询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可 ...

  4. Elasticsearch系列---结构化搜索

    概要 结构化搜索针对日期.时间.数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么不符合条件在结果集之外 ...

  5. Elasticsearch 结构化搜索、keyword、Term查询

    前言 Elasticsearch 中的结构化搜索,即面向数值.日期.时间.布尔等类型数据的搜索,这些数据类型格式精确,通常使用基于词项的term精确匹配或者prefix前缀匹配.本文还将新版本的&qu ...

  6. ElasticSearch 2 (13) - 深入搜索系列之结构化搜索

    ElasticSearch 2 (13) - 深入搜索系列之结构化搜索 摘要 结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的.它们都有精确的格式,我们可以对这些数据进行逻 ...

  7. ElasticSearch 结构化搜索

    1.介绍 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作. 比较常见的操作 ...

  8. elasticsearch 深入 —— 结构化搜索

    结构化搜索 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作.比较常见的操作 ...

  9. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

随机推荐

  1. 关于checkbox全选与全不选的实现与遇到的问题

    HTML: <div class="outbox"> <label for="box">全选</label> <inp ...

  2. hbase记录-修改压缩格式

    在业务空闲的时候修改压缩格式 先测试 ---测试表create 'test', { NAME => 'c',VERSIONS => 1}desc 'test'disable 'test'a ...

  3. TCP和UDP的区别和优缺点

    1.TCP与UDP区别总结: 1.TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2.TCP提供可靠的服务.也就是说,通过TCP连接传送的数据,无差错,不丢失 ...

  4. UVALive - 7263 Today Is a Rainy Day(bfs)

    原题链接 题意 给两个等长的只含数字1,2,3,4,5,6的字符串s(|s|≤110),有两种操作: - 把一个位置的数字换成另一个数字,换成的数字也只能是1到6- 把这个字符串中相同的数字都换成另一 ...

  5. CodeChef - AMLEX-Poetic word

    题目链接  Dhinwaji is an acclaimed poet and likes to play with words and letters. He has bought some sti ...

  6. chart 数据 图表插件

    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js">< ...

  7. @ImportResource 导入Spring 的xml配置文件

    在配置类尚标注此注解,等同于spring配置文件中的 <import resource="beans.xml"/> Spring Boot里面没有Spring的配置文件 ...

  8. 20155335俞昆 《java程序设计》第八周总结

    2016-2017-2 <Java程序设计>第X周学习总结 ##认识NIO 在java中,输入与输出,基本上是以字节为单位进行的低层次处理,实际上多半是对字节数组中整个区块进行处理,对于d ...

  9. html5 流动布局

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. dubbo集群服务下一台服务挂了对服务调用的影响

    一.问题描述:项目中2台dubbo服务给移动端提供查询接口,移动端反应说查询时而很快(秒刷),时而很慢(4-5秒). 二.问题分析: 1.问题猜想:网络不稳定原因导致,但是切换公司wifi和手机4G, ...