加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

elasticsearch Query详解

(2016-11-09 18:12:03)

elasticsearch 分布式搜索系列专栏:http://blog.csdn.net/xiaohulunb/article/category/2399789

内容涉及代码GitHub地址: 点击打开链接


来源:http://blog.csdn.net/xiaohulunb/article/details/37877435
           http://blog.csdn.net/xiaohulunb/article/details/37881525
           http://blog.csdn.net/xiaohulunb/article/details/37818933

官方API:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/query-dsl-queries.html





 @NotSolved未解决


[java] view plain copy

    package com.elasticsearch; 
     
    import org.elasticsearch.action.ActionListener; 
    import org.elasticsearch.action.search.SearchResponse; 
    import org.elasticsearch.index.query.IndicesQueryBuilder; 
    import org.elasticsearch.index.query.QueryBuilder; 
    import org.elasticsearch.index.query.QueryBuilders; 
     
    /////
     // Created by lw on 14-7-15.
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     // elasticsearch以提供了一个完整的Java查询dsl其余查询dsl。
     // QueryBuilders工厂构建
     // API:
     // http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/query-dsl-queries.html
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     /// 
    public class Es_QueryBuilders_DSL { 
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // match query 单个匹配
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder matchQuery() { 
            return QueryBuilders.matchQuery("name", "葫芦4032娃"); 
       
     
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // multimatch  query
         // 创建一个匹配查询的布尔型提供字段名称和文本。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder multiMatchQuery() { 
            //现住址和家乡在【山西省太原市7429街道】的人 
            return QueryBuilders.multiMatchQuery( 
                    "山西省太原市7429街道",     // Text you are looking for 
                    "home", "now_home"       // Fields you query on 
            ); 
       
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // boolean query and 条件组合查询
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder booleanQuery() { 
     
            return QueryBuilders 
                    .boolQuery() 
                    .must(QueryBuilders.termQuery("name", "葫芦3033娃")) 
                    .must(QueryBuilders.termQuery("home", "山西省太原市7967街道")) 
                    .mustNot(QueryBuilders.termQuery("isRealMen", false)) 
                    .should(QueryBuilders.termQuery("now_home", "山西省太原市")); 
       
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // ids query
         // 构造一个只会匹配的特定数据 id 的查询。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder idsQuery() { 
            return QueryBuilders.idsQuery().ids("CHszwWRURyK08j01p0Mmug", "ojGrYKMEQCCPvh75lHJm3A"); 
       
     
        /////
         // TODO NotSolved
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // constant score query
         // 另一个查询和查询,包裹查询只返回一个常数分数等于提高每个文档的查询。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder constantScoreQuery() { 
            ///return // Using with Filters
                    QueryBuilders.constantScoreQuery(FilterBuilders.termFilter("name", "kimchy"))
                            .boost(2.0f);/// 
     
            // With Queries 
            return QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("name", "葫芦3033娃")) 
                    .boost(2.0f); 
       
     
        /////
         // TODO NotSolved
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // disjunction max query
         // 一个生成的子查询文件产生的联合查询,
         // 而且每个分数的文件具有最高得分文件的任何子查询产生的,
         // 再加上打破平手的增加任何额外的匹配的子查询。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder disMaxQuery() { 
            return QueryBuilders.disMaxQuery() 
                    .add(QueryBuilders.termQuery("name", "kimchy"))          // Your queries 
                    .add(QueryBuilders.termQuery("name", "elasticsearch"))   // Your queries 
                    .boost(1.2f) 
                    .tieBreaker(0.7f); 
       
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // fuzzy query
         // 使用模糊查询匹配文档查询。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder fuzzyQuery() { 
            return QueryBuilders.fuzzyQuery("name", "葫芦3582"); 
       
     
        /////
         // TODO NotSolved
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // has child / has parent
         // 父或者子的文档查询
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder hasChildQuery() { 
            return // Has Child 
                    QueryBuilders.hasChildQuery("blog_tag", 
                            QueryBuilders.termQuery("tag", "something")); 
     
            // Has Parent 
            ///return QueryBuilders.hasParentQuery("blog",
                    QueryBuilders.termQuery("tag","something"));/// 
       
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // matchall query
         // 查询匹配所有文件。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder matchAllQuery() { 
            return QueryBuilders.matchAllQuery(); 
       
     
        /////
         // TODO NotSolved
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // more like this (field) query (mlt and mlt_field)
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder moreLikeThisQuery() { 
            // mlt Query 
            QueryBuilders.moreLikeThisQuery("home", "now_home") // Fields 
                    .likeText("山西省太原市7429街道")                 // Text 
                    .minTermFreq(1)                                 // Ignore Threshold 
                    .maxQueryTerms(12);                             // Max num of Terms 
            // in generated queries 
     
            // mlt_field Query 
            return QueryBuilders.moreLikeThisFieldQuery("home")              // Only on single field 
                    .likeText("山西省太原市7429街道") 
                    .minTermFreq(1) 
                    .maxQueryTerms(12); 
       
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // prefix query
         // 包含与查询相匹配的文档指定的前缀。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder prefixQuery() { 
            return QueryBuilders.prefixQuery("name", "葫芦31"); 
       
     
        /////
         // TODO NotSolved
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // querystring query
         //   查询解析查询字符串,并运行它。有两种模式,这种经营。
         // 第一,当没有添加字段(使用{ @link QueryStringQueryBuilder #字段(String)},将运行查询一次,非字段前缀
         //   将使用{ @link QueryStringQueryBuilder # defaultField(字符串)}。
         // 第二,当一个或多个字段
         //   (使用{ @link QueryStringQueryBuilder #字段(字符串)}),将运行提供的解析查询字段,并结合
         //   他们使用DisMax或者一个普通的布尔查询(参见{ @link QueryStringQueryBuilder # useDisMax(布尔)})。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder queryString() { 
            return QueryBuilders.queryString("+kimchy -elasticsearch"); 
       
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // range query
         // 查询相匹配的文档在一个范围。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder rangeQuery() { 
            return QueryBuilders 
                    .rangeQuery("name") 
                    .from("葫芦1000娃") 
                    .to("葫芦3000娃") 
                    .includeLower(true)     //包括下界 
                    .includeUpper(false); //包括上界 
       
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // span queries (first, near, not, or, term)
         // 跨度查询
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder spanQueries() { 
            // Span First 
            QueryBuilders.spanFirstQuery( 
                    QueryBuilders.spanTermQuery("name", "葫芦580娃"),  // Query 
                    30000                                             // Max查询范围的结束位置 
            ); 
     
            // Span Near TODO NotSolved 
            QueryBuilders.spanNearQuery() 
                    .clause(QueryBuilders.spanTermQuery("name", "葫芦580娃")) // Span Term Queries 
                    .clause(QueryBuilders.spanTermQuery("name", "葫芦3812娃")) 
                    .clause(QueryBuilders.spanTermQuery("name", "葫芦7139娃")) 
                    .slop(30000)                                               // Slop factor 
                    .inOrder(false) 
                    .collectPayloads(false); 
     
            // Span Not TODO NotSolved 
            QueryBuilders.spanNotQuery() 
                    .include(QueryBuilders.spanTermQuery("name", "葫芦580娃")) 
                    .exclude(QueryBuilders.spanTermQuery("home", "山西省太原市2552街道")); 
     
            // Span Or TODO NotSolved 
            return QueryBuilders.spanOrQuery() 
                    .clause(QueryBuilders.spanTermQuery("name", "葫芦580娃")) 
                    .clause(QueryBuilders.spanTermQuery("name", "葫芦3812娃")) 
                    .clause(QueryBuilders.spanTermQuery("name", "葫芦7139娃")); 
     
            // Span Term 
            //return QueryBuilders.spanTermQuery("name", "葫芦580娃"); 
       
     
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // term query
         // 一个查询相匹配的文件包含一个术语。。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder termQuery() { 
            return QueryBuilders.termQuery("name", "葫芦580娃"); 
       
     
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // terms query
         // 一个查询相匹配的多个value
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder termsQuery() { 
            return QueryBuilders.termsQuery("name", // field 
                    "葫芦580娃", "葫芦3812娃")                 // values 
                    .minimumMatch(1);               // 设置最小数量的匹配提供了条件。默认为1。 
       
     
        /////
         // TODO NotSolved
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // top children  query
         // 构建了一种新的评分的子查询,与子类型和运行在子文档查询。这个查询的结果是,那些子父文档文件匹配。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder topChildrenQuery() { 
            return QueryBuilders.topChildrenQuery( 
                    "blog_tag",                                 // field 
                    QueryBuilders.termQuery("name", "葫芦3812娃") // Query 
           
                    .score("max")                               // max, sum or avg 
                    .factor(5) 
                    .incrementalFactor(2); 
       
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // wildcard query
         //   实现了通配符搜索查询。支持通配符// < /tt>,
         //   匹配任何字符序列(包括空),
? < /tt>,
         //   匹配任何单个的字符。注意该查询可以缓慢,因为它
         //   许多方面需要遍历。为了防止WildcardQueries极其缓慢。
         //   一个通配符词不应该从一个通配符// < /tt>或
         //   < /tt>
?。
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder wildcardQuery() { 
            return QueryBuilders.wildcardQuery("name", "葫芦//2娃"); 
       
     
        /////
         // TODO NotSolved
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // nested query
         // 嵌套查询
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static QueryBuilder nestedQuery() { 
            return QueryBuilders.nestedQuery("location",               // Path 
                    QueryBuilders.boolQuery()                      // Your query 
                            .must(QueryBuilders.matchQuery("location.lat", 0.962590433140581)) 
                            .must(QueryBuilders.rangeQuery("location.lon").lt(0.00000000000000000003)) 
           
                    .scoreMode("total");                  // max, total, avg or none 
       
     
        /////
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         // indices query
         // 索引查询
         // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         /// 
        protected static IndicesQueryBuilder indicesQuery() { 
            // Using another query when no match for the main one 
            QueryBuilders.indicesQuery( 
                    QueryBuilders.termQuery("name", "葫芦3812娃"), 
                    Es_Utils.INDEX_DEMO_01, "index2" 
                 //设置查询索引上执行时使用不匹配指数 
                    .noMatchQuery(QueryBuilders.termQuery("age", "葫芦3812娃")); 
     
     
            // Using all (match all) or none (match no documents) 
            return QueryBuilders.indicesQuery( 
                    QueryBuilders.termQuery("name", "葫芦3812娃"), 
                    Es_Utils.INDEX_DEMO_01, "index2" 
                // 设置不匹配查询,可以是 all 或者 none 
                    .noMatchQuery("none"); 
       
     
     
     
     
        public static void main(String[] args) { 
            Es_Utils.startupClient(); 
            try { 
                searchTest(indicesQuery()); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                Es_Utils.shutDownClient(); 
           
       
     
        private static void searchTest(QueryBuilder queryBuilder) { 
            //预准备执行搜索 
            Es_Utils.client.prepareSearch(Es_Utils.INDEX_DEMO_01) 
                    .setTypes(Es_Utils.INDEX_DEMO_01_MAPPING) 
                    .setQuery(queryBuilder) 
                    .setFrom(0).setSize(20).setExplain(true) 
                    .execute() 
                            //注册监听事件 
                    .addListener(new ActionListener() { 
                        @Override 
                        public void onResponse(SearchResponse searchResponse) { 
                            Es_Utils.writeSearchResponse(searchResponse); 
                       
     
                        @Override 
                        public void onFailure(Throwable e) { 
     
                       
                    }); 
       
   

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有