• Elasticsearch java api 基本搜索部分详解


    一、所使用版本的介绍

    使用的是elasticsearch2.1.0版本,在此只是简单介绍搜索部分的api使用

    二、简单的搜索

    使用api的时候,基本上可以将DSL搜索的所有情况均写出来,在此给出一个最简单搜索的全部的过程以及代码,之后将对不同的搜索只是针对函数进行介绍

    (1)DSL搜索

    对于最简单的DSL搜索,对一个词进行搜索使用url直接进行通信,例如,如果对于一个字段,搜索具体的一个term或者query,DSL如下所示:

    {“query”:{"term":{"title":"molong1208 blog"}}}

    这个搜索的含义是:在title字段,搜索内容为molong1208 blog;上面是DSL的写法,实际上对于简单的查询,也可以直接使用url查询,不带json格式,假设我们所使用的服务器ip是localhost,对于如上的查询可以写为: 

    localhost:9200/index/type/_search? q=title:molong1208 blog

    这个写法与上边的DSL语言是同样的功能的,但是这种写法只是一些简单的查询才可以用,例如显示想要的字段,按照某一字段排序等

    localhost:9200/index/type/_search? q=title:molong1208 blog&fields=name,title&sort=id:desc&pretty=true

    上述url的意思就是在index/type里面的title字段搜索内容,并且显示的字段为name以及title,按照id降序排序,输出的格式为美化的json格式

    (2)使用java api 实现简单搜索

    1、建立连接

    java api使用搜索的时候,必须先进行连接,在直接url的时候是端口9200,但是在使用程序的时候为9300,如下所示,建立客户端的连接,在connection类里面给出初始化函数

    [java] view plain copy
     
    1. private static void open()  
    2.     {  
    3.             Settings settings = Settings.settingsBuilder()  
    4.                     .put("cluster.name", "molong").build();  
    5.                       
    6.             try {  
    7.                 client =  TransportClient.builder().settings(settings).build()  
    8.                         .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));  
    9.             } catch (UnknownHostException e) {  
    10.                 // TODO Auto-generated catch block  
    11.                 e.printStackTrace();  
    12.             }  
    13.   
    14.     }  

    在此使用的是TransportClient连接,还有一个Nodeclient,没使用过,在此不做介绍

    2、进行查询

    查询的时候,需要建立一个SearchRequestBuilder,这里面将给出对于哪一个index或者type进行查询,并且所有的设置都可以在这里面进行实现,例如模糊查询,范围查询,前缀查询等

    [java] view plain copy
     
    1. SearchRequestBuilder responsebuilder = client.prepareSearch("index").setTypes("type")  

    上述代码的意思是对于index的type进行查询,其中client即使得到的建立链接,下一步就是要将查询词给进去

    [java] view plain copy
     
    1. SearchResponse myresponse=responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))  
    2. .setFrom(0).setSize(10).setExplain(true).execute().actionGet();  

    上述代码就是讲所要查询的词塞进去,其中setfrom,setsize是指一页显示的多少,从第几个开始,显示size个数据

    3、展示

    [java] view plain copy
     
    1. SearchHits hits = myresponse.getHits();  
    2. for (int i = 0; i < hits.getHits().length; i++) {  
    3.            System.out.println(hits.getHits()[i].getSourceAsString());}  

    其中还可以使用hits.getHits()[i].getSource(),这是一个map的格式,可以将具体要展示的进行展示出来

    三、搜索时其他api的实现

    读DSL的时候我们可以看到,查询有很多的查询,比如说多域,比如说过滤等查询条件,下面就针对Elasticsearch服务器开发中一些基本查询的DSL给出在java api实现的一些形式,其中很多形式不同的之处只是上述塞查询词时候的setQuery里面的不同,所以在此只是讲述里面的函数不同

    (1)基本查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.matchPhraseQuery("title", "molong1208 blog"))  
    
    

    所使用的是matchPhraseQuery(field,text)函数,这个函数的参数有两个,其中对应text的部分是要解析的,例如,molong1208 blog 可能经过解析之后会解析成molong1208 以及blog然后再进行查询的

    (2)多词条查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.termsQuery("title", "molong1208","blog","csdn"))  

    对于三个词molong1208,blog,csdn在title字段进行查询,如果有三者中的任意一个即算匹配

    (3)match_all查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.matchAllQuery())  

    (4)常用词查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.commonTermsQuery("name", "lishici"))  

    可以在后面设置具体的cutoffFrequency

    (5)match查询

    只使用过matchPhraseQuery函数,具体用法见上述所示

    (6)multi_match查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.multiMatchQuery("lishi", "subcat","name"))  

    multiMatchQuery(text,fields)其中的fields是字段的名字,可以写好几个,每一个中间用逗号分隔

    (7)query_string查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.queryStringQuery(""))  

    没使用过这个查询,所以对此查询不是很熟悉,所对应的是Elasticsearch服务器开发的3.3.7,具体使用的时候可以再深究如何使用

    (8)simple_query_string查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.simpleQueryStringQuery(""))  

    同上所示,3.3.8

    (9)标识符查询

    个人理解应该是类似如下的查询,具体请各位用的时候再次去研究具体哪一个

    [java] view plain copy
     
    1. GetResponse getresponse = client.prepareGet("users", "user", "3").get();  

    (10)前缀查询

    [javascript] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.prefixQuery("title", "mo"))  

    前一个参数为使用的field后一个参数为所使用的前缀词

    (11)fuzzy_like_this,fuzzy_like_this_field,fuzzy查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.fuzzyQuery("title", "malong"))  

    在所使用的版本,没发现如何使用fuzzy_like_this以及fuzzy_like_this_field的函数,不清楚是否有这个功能,只发现有fuzzy查询,后面可以设置boost等值

    (12)通配符查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.wildcardQuery("title", "molo?g"))  

    (13)more_like_this,more_like_this_field

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery().addLikeText("long"))  
    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.moreLikeThisQuery("long"))  

    有两个方法,其中第二个是在_all范围内进行查询,第一个后面还有很多可以设置,有需要用的可以具体参考

    (14)rang查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.rangeQuery("age").gt(10).lt(20))  

    对于某一个field,大于多少,小于多少

    (15)dismax查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.disMaxQuery().add(QueryBuilders.termQuery("title", "molong1208")))  

    (16)正则表达式查询

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.regexpQuery(field, regexp))  

    四、bool查询

    上述只是大概给出了具体的查询方式,有些时候可能我们所想要的为比较复杂的查询,例如想要查一个在某个字段必须有某个值,并且另一个字段必须有另外一个值的情况,这种时候就可以使用bool查询,例如下所示

    [java] view plain copy
     
    1. responsebuilder.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.multiMatchQuery(query, "name","title","title_1")).must(QueryBuilders.multiMatchQuery(query2, "title2","title3")))  

    上述的意思是,在title或者title_1或者name字段有query,并且在title2或者title3字段有query2的结果召回来

    当然,可以根据自己的情况,有should,must_not等选择

    五、过滤器

    在使用过滤的时候,版本2.1.0仅仅有postfilter,例如

    [java] view plain copy
     
    1. responsebuilder.setPostFilter(QueryBuilders.existsQuery("title"))  

    表示的就是exists过滤,对有title字段的过滤,个人是这么理解的,可能有误

    [java] view plain copy
     
    1. responsebuilder.setPostFilter(QueryBuilders.missingQuery("title"))  

    这个的意义与上面的完全不同,可以参考Elasticsearch服务器开发具体章节的介绍

    且postfilter为对结果级进行过滤即搜索出来的结果,对结果进行过滤的,可以理解为后置的过滤器,es大部分都是先过滤后聚合,这个可以设置为先聚合后过滤

    六、免责声明

    以上部分均为个人所理解所写,刚接触,可能有很多是错误的,望各位指正,勿喷,希望大家共同进步

    转载:http://blog.csdn.net/molong1208/article/details/50512149

  • 相关阅读:
    Mysql 修改本地密码
    关于Ubuntu18.04 linux系统使用安装JDK Mysql
    关于 java编程思想第五版 《On Java 8》
    关于Ubuntu18.04 linux系统使用搜狗输入法 出现乱码
    关于Ubuntu18.04 linux系统下使用Tim QQ 微信
    项目启动时报错Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
    Ubuntu 16.04 LTS 64位系统 安装Docker
    安装Ubuntu服务器版 + 远程连接ssh +更换阿里云源
    机器学习-简单线性回归(一)
    机器学习-神经网络算法应用(二)
  • 原文地址:https://www.cnblogs.com/a-du/p/7736181.html
Copyright © 2020-2023  润新知