The high-level full text queries are usually used for running full text queries on full text fields like the body of an email. They understand how the field being queried is analyzed and will apply each field’s analyzer (or search_analyzer) to the query string before executing.

包括match query、match_phrase query、match_phrase_prefix query、multi_match query、common terms query、query_string query、simple_query_string query。

在学习各种query时,可以设置query同级的profile属性值为true来了解es具体是如何解析各query命令的。即请求体如下:

{
    "profile": true,
    "query": {

}
}

match query

get /website/_search
{
    "query":{
        "match": {
            "name": "kobe bean bryant"
        }
    }
}

match query接受text类型、numeric类型(包括byte、short、integer、long、float、double等)、date类型字段的查询。如果查询的字段是text类型的话,就是常说的分词查询。查询关键字会被分词,某文档字段值分词后的词条集只要和查询关键字分词后的词条集有交集,就能被查出来。如果查询的字段是numeric类型、date类型,这里查询关键字就不会分词了,查询关键字和文档字段值完全匹配才能查得出来。

multi_match query

get /website/_search
{
    "query":{
        "multi_match":{
            "query":"kobe bean",
            "fields":["name", "nick_name"]
        }
    }
}

multi_match query,顾名思义,多match查询,这里的多指的是一次可以查询多个字段,而不是指定多个查询关键字。如上面的,name字段值match查询关键字kobe bean的文档可以被查出来,nick_name字段值match查询关键字kobe bean的文档也可以被查出来。

在指定查询字段时,还可以用通配符,如

get /website/_search
{
    "query":{
        "multi_match":{
            "query":"kobe bean",
            "fields":["name", "*_name"]
        }
    }
}

这样,nick_name、first_name、last_name等所有以_name为后缀的字段都会被查询,假如某一个字段的值match查询关键字kobe bean,这个文档就会被查出来。

match_phrase query

get /website/_search
{
    "query": {
        "match_phrase": {
            "name": "kobe bean bryant"
        }
    }
}

在match query的基础上,要求查询关键字在分词后各词条的相对位置(position)要和文档字段值分词后相应词条的相对位置(position)相同,满足这个条件的文档才能被查出来。

假如查询字符串是kobe bean bryant,则分词后会是kobe position 0、bean position 1、bryant position 2,只有同时包含kobe、bean、bryant这三个词条且这三个词条依次紧挨着(中间没有其他词条)的文档才能被查出来,在文档字段值中kobe bean bryant前后有没有其他单词无所谓。例如,通过kobe bean bryant进行match_phrase query可以查询出字段值是john kobe bean bryant peter的文档,也可以查询出@kobe bean bryant@的文档,因为字符串在被standard分析器处理时,@字符会被直接忽略掉。

从另一个角度理解,不考虑分析器处理造成的大小写转换、特殊符号省略的话,只有文档字段值contains查询字符串的文档才会被查出来。

match_phrase_prefix query

get /website/_search
{
    "query": {
        "match_phrase_prefix": {
            "name": "kobe bean b"
        }
    }
}

和match_phrase query差不多,区别是查询关键字最后一个单词可以只写前面一个或几个字符,如用kobe bean b进行match_phrase_prefix query可以查出字段值是kobe bean bryant的文档,也可以查出字段值是kobe bean brother的文档,后者用kobe bean bryant进行match_phrase query查不出来。

query_string query

get /website/_search
{
    "query":{
        "query_string": {
            "default_field": "name",
            "query": "Kobe Bean OR Steven Jobs"
        }
    }
}

query_string query在查询text类型字段和keyword类型字段时,解析是不一样的。

如果查询字段是text类型,query_string query会把查询关键字依据分割符(默认是大写的OR)分割,然后用分割后的子字符串在指定字段上查询。如上,Kobe Bean OR Steven Jobs会被分割成Kobe Bean和Steven Jobs,然后在name字段上查询。Kobe Bean会被standard分析器处理成kobe和bean,Steven Jobs会被standard分析器处理成steven和jobs,name字段值被分析器处理后只要有这4个词条中的一个,该文档就会被查出来。

如果查询字段是keyword类型,则又要根据查询关键字有没有分割符分为两种情况:如果没有分隔符,比如查询关键字是Kobe Bean,这个时候查询关键字不会被任何分析器处理,故此时相当于term query,只有字段值是Kobe Bean的文档才会被查询出来。如果有分割符,比如查询关键字是Kobe Bean OR Steven Jobs,则查询关键字还是先被OR分割成Kobe Bean和Steven Jobs,然后Kobe Bean会被whitespace分析器处理成Kobe和Bean,Steven Jobs会被whitespace分析器处理成Steven和Jobs。之后转化成4个term query,彼此之间是or的关系,只要满足一个,即字段值只要是Kobe、Bean、Steven、Jobs中的任意一个,文档就能被查出来。

以上分析过程是通过设置profile等于true分析出来的。

从上面分析过程可以看出,如果查询字段是text类型,并且查询关键字没有分隔符的话,query_string query和match query效果是一样的。

query_string query还可以像multi_match query一样,一次查询多个字段,只需用fields关键字代替default_field,并且指定一个字段数组即可。

get website/_search
{
    "query": {
        "query_string": {
            "fields" : ["name", "nick_name"],
            "query": "Kobe Bean OR Steven Jobs"
        }
    }
}

simple_query_string query

get website/_search
{
    "query": {
        "simple_query_string": {
            "fields" : ["name", "nick_name"],
            "query": "Kobe Bean OR Steven Jobs"
        }
    }
}

servlet中路径的获取的更多相关文章

  1. java中路径的获取

    网上摘录 (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getReque ...

  2. Servlet中路径信息总结

    ./ 当前目录 ../ 父级目录 / 根目录 资源寻找都是依靠路径,资源存储方式是按照哈希表运算的,所以路径的计算其实就是哈希值的计算. servlet中,所有路径的配置都要用绝对路径. 什么是绝对路 ...

  3. servlet中请求转发获取数据等,,,

    String uname= req.getParameter("uname");  获取请求的字符串 req.setAttribute("str"," ...

  4. servlet中通过getWriter()获取out返回给浏览器出现中文乱码问题

    感谢博主https://blog.csdn.net/louyongfeng3613/article/details/50160317 在Servlet编程中,经常需要通过response对象将一些信息 ...

  5. Servlet中的属性(attribute)和参数(parameter)的区别

    1.引子 初学者对属性(attribute)和参数(parameter)容易搞混.没搞清他们的区别,项目中就可能出现一此莫名其妙的问题. 2.两者的区别 1) 属性(attribute) 属性是在后台 ...

  6. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  7. Servlet中获取JSP内置对象

    方便自己查询,嫌低级的勿喷.... 1.request 在servlet的doGet和doPost的参数中就有HttpServletRequest req参数,而JSP内置request对象就是Htt ...

  8. java中几种获取项目路径方式

    转自http://caodaoxi.iteye.com/blog/1234805     在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录 ...

  9. servlet中获取各种相对地址(服务器、服务器所在本地磁盘、src等)。

    [本文简介] 本文将提供javaWeb中经常使用到的相对路径的获取方法,分别有: url基本地址 带目录的url地址 服务器的根路径 服务器所在的 本地磁盘路径 服务器所在的本地磁盘路径,带文件夹 S ...

随机推荐

  1. uhttpd配置文件分析

    文件位于 /etc/config/uhttpd. root@hbg:/etc/config# cat uhttpd config uhttpd 'main'        list listen_ht ...

  2. c++的函数模板和类模板

    函数模板和普通函数区别结论: 函数模板不允许自动类型转化 普通函数能够进行自动类型转换 函数模板和普通函数在一起,调用规则: 1 函数模板可以像普通函数一样被重载 2 C++编译器优先考虑普通函数 3 ...

  3. ubuntu安装docker

    uname -r #查看内核版本要大于3.10apt-get updateapt-get install linux-image-generic-lts-trusty wget -qO- https: ...

  4. 高精度运算专题-输出函数与字符串转数字函数(Output function and the string to number function)

    输出函数:这个函数别看它小,但浓缩的都是精华啊 作用:对于高精度的数组进行倒序输出 思路:首先从被传入的数组第一位开始,一直往前扫输出就可以了(i--) 注释:因为每个数组的第一位是用来存储这个数组的 ...

  5. C# 编辑距离实现

    /// <summary> /// 计算 /// </summary> /// <param name="str1"></param> ...

  6. windows cmd启动heritrix

    首先下载heritrix-1.14.4.zip文件,可以在http://sourceforge.net/projects/archive-crawler/files/heritrix3/下载.下载后解 ...

  7. ural 1118. Nontrivial Numbers

    1118. Nontrivial Numbers Time limit: 2.0 secondMemory limit: 64 MB Specialists of SKB Kontur have de ...

  8. 10个男孩和n个女孩共买了n2+8n+2本书,已知他们每人买的书本的数量是相同的,且女孩人数多于南海人数,问女孩人数是多少?(整除原理1.1.3)

    10个男孩和n个女孩共买了n2+8n+2本书,已知他们每人买的书本的数量是相同的,且女孩人数多于南海人数,问女孩人数是多少? 解: 因为,每个人买的书本的数量是相同的, 所以,10|n2+8n+2 所 ...

  9. html5+css3学习笔记音频和视频

    格式 IE Firefox Opera Chrome Safari Ogg No 3.5+ 10.5+ 5.0+ No MPEG 4 9.0+ No No 5.0+ 3.0+ WebM No 4.0+ ...

  10. 29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    //Vehicle类 package d922A; public class Vehicle { private int wheels; private double weight; Vehicle( ...