ES脚本查询空字符串

本文介绍的查询方法是基于ES5.2版本的,可能对其他版本不适用。其他版本请参考官网: https://www.elastic.co/guide/en/elasticsearch/reference/5.2/modules-scripting-fields.html https://www.elastic.co/guide/en/elasticsearch/reference/5.2/modules-scripting-painless-syntax.html

查询字段为空的文档

curl localhost:9200/customer/_search?pretty -d'{
    "size": 5,
    "query": {
        "bool": {
            "must": {
                "script": {
                    "script": {
                        "inline": "params._source.strnickname.length()<1",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}'

doc,fields和_source用法

doc:除了analyzed text 类型的字段,其余的字段默认都是开着doc_values的。doc可以查询text字段,前提是fielddata要开启。但是开启fielddata后,查询时将加载所有的term进入JVM heap。内存消耗太大,慎用。官网上说可用可用doc['field_name']查询,但是测试后发现不可以,但可通过doc.field_name查询。后又几经测试,发现是单引号的问题。doc['field_name']无法查询。总是报错:

"caused_by" : {
        "type" : "script_exception",
        "reason" : "compile error",
        "caused_by" : {
          "type" : "illegal_argument_exception",
          "reason" : "Variable [field_name] is not defined."
        },
        "script_stack" : [
          "doc[field_name].length() <  ...",
          "    ^---- HERE"
        ],
        "script" : "doc[field_name].length() < 1",
        "lang" : "painless"
      }

但是doc[\u0027field_name\u0027]可以查询,doc['''field_name''']也可以查询。对上述例子可通过下述查询方式查询

curl localhost:9200/customer/_search?pretty -d'{
    "size": 5,
    "query": {
        "bool": {
            "must": {
                "script": {
                    "script": {
                        "inline": "doc['\''strnickname'\''].length()<1",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}'

fields:仅标记为 "store": true 的字段可用,可通过_fields['field_name'].value or _fields['field_name'].values查询。

_source:是一个特殊的store fields。任何字段都可以使用。可通过_source.field_name访问。

curl -XPUT 'localhost:9200/my_index?pretty' -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "my_type": {
      "properties": {
        "title": { 
          "type": "text"
        },
        "first_name": {
          "type": "text",
          "store": true
        },
        "last_name": {
          "type": "text",
          "store": true
        }
      }
    }
  }
}
'
curl -XPUT 'localhost:9200/my_index/my_type/1?pretty' -H 'Content-Type: application/json' -d'
{
  "title": "Mr",
  "first_name": "Barry",
  "last_name": "White"
}
'
curl -XGET 'localhost:9200/my_index/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "script_fields": {
    "source": {
      "script": {
        "inline": "params._source.title + ' '+ params._source.first_name + ' ' + params._source.last_name" 
      }
    },
    "stored_fields": {
      "script": {
        "inline": "params._fields['first_name'].value + ' ' + params._fields['last_name'].value"
      }
    }
  }
}
'

doc比store fields性能要好的多

Stored fields (which includes the stored _source field) are much slower than doc-values. They are optimised for returning several fields per result, while doc values are optimised for accessing the value of a specific field in many documents. It makes sense to use _source or stored fields when generating a script field for the top ten hits from a search result but, for other search and aggregation use cases, always prefer using doc values.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

MySQL 二进制日志(Binary Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日...

1302
来自专栏清风

MySQL数据库 原

其中“/yourpath/crontab_mysql.sql”为需要执行的sql语句。

993
来自专栏乐沙弥的世界

MongoDB 索引创建

七、更多参考 MongoDB 单键(列)索引 MongoDB 复合索引 MongoDB 多键索引 MongoDB 执行计划获取(db.colle...

2760
来自专栏后端技术探索

mysql新特性

oracle官方发布的基准测试声明:In benchmark tests using SysBench Read-only Point-Selects, at ...

1103
来自专栏Grace development

MySQL常用系统表汇总

本篇文章虽大部分内容为参考原文作者的相关内容,但对原文对于文章的逻辑与排版上进行了大范围修改,方便阅读与理解。原文链接在底部

3922
来自专栏Django Scrapy

mysql安装GENERALMyISAMSAFETYDATA STORAGEBINARY LOGGINGREPLICATIONCACHES AND LIMITSINNODBLOGGINGFOR SLA

MYSQL数据库安装文档 本文档是MYSQL-5.6.25在CENTOS 6.5 64位版本上安装的文档,经过测试并没有发现问题。 安装以前先查看服务器里是...

3267
来自专栏我的博客

TP入门第八天

[小型留言板-增删查改] 1、先建立数据库lyb,然后建立表lyb_notes 建表代码如下: CREATE TABLE `lyb_notes` ( `id` ...

3568
来自专栏张戈的专栏

MySQL命令行工具:percona-toolkit安装使用初探

导读:percona-toolkit 源自 Maatkit 和 Aspersa 工具,这两个工具是管理 mysql 的最有名的工具,现在 Maatkit 工具已...

4047
来自专栏程序猿

oracle 数据库常用命令

1、su – oracle 不是必需,适合于没有DBA密码时使用,可以不用密码来进入sqlplus界面。 2、sqlplus /nolog 或sqlplus s...

3319
来自专栏杨建荣的学习笔记

MySQL断电恢复的一点简单分析

今天有个网友问我一个MySQL的恢复问题。提供的截图如下。 ? 对于这个问题,在一些断电的场景下还是可能出现的。我首先是要确认是否为线上业务还是测试环境...

51810

扫码关注云+社区

领取腾讯云代金券