• elasticsearch------java操作之QueryBuilders构建搜索Query


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

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

     

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


     
     
     @NotSolved未解决
     
     
    [java] view plain copy
     
    1. package com.elasticsearch;  
    2.   
    3. import org.elasticsearch.action.ActionListener;  
    4. import org.elasticsearch.action.search.SearchResponse;  
    5. import org.elasticsearch.index.query.IndicesQueryBuilder;  
    6. import org.elasticsearch.index.query.QueryBuilder;  
    7. import org.elasticsearch.index.query.QueryBuilders;  
    8.   
    9. /** 
    10.  * Created by lw on 14-7-15. 
    11.  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    12.  * elasticsearch以提供了一个完整的Java查询dsl其余查询dsl。 
    13.  * QueryBuilders工厂构建 
    14.  * API: 
    15.  * <a>http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/query-dsl-queries.html</a> 
    16.  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    17.  */  
    18. public class Es_QueryBuilders_DSL {  
    19.   
    20.     /** 
    21.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    22.      * match query 单个匹配 
    23.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    24.      */  
    25.     protected static QueryBuilder matchQuery() {  
    26.         return QueryBuilders.matchQuery("name", "葫芦4032娃");  
    27.     }  
    28.   
    29.   
    30.     /** 
    31.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    32.      * multimatch  query 
    33.      * 创建一个匹配查询的布尔型提供字段名称和文本。 
    34.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    35.      */  
    36.     protected static QueryBuilder multiMatchQuery() {  
    37.         //现住址和家乡在【山西省太原市7429街道】的人  
    38.         return QueryBuilders.multiMatchQuery(  
    39.                 "山西省太原市7429街道",     // Text you are looking for  
    40.                 "home", "now_home"       // Fields you query on  
    41.         );  
    42.     }  
    43.   
    44.     /** 
    45.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    46.      * boolean query and 条件组合查询 
    47.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    48.      */  
    49.     protected static QueryBuilder booleanQuery() {  
    50.   
    51.         return QueryBuilders  
    52.                 .boolQuery()  
    53.                 .must(QueryBuilders.termQuery("name", "葫芦3033娃"))  
    54.                 .must(QueryBuilders.termQuery("home", "山西省太原市7967街道"))  
    55.                 .mustNot(QueryBuilders.termQuery("isRealMen", false))  
    56.                 .should(QueryBuilders.termQuery("now_home", "山西省太原市"));  
    57.     }  
    58.   
    59.     /** 
    60.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    61.      * ids query 
    62.      * 构造一个只会匹配的特定数据 id 的查询。 
    63.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    64.      */  
    65.     protected static QueryBuilder idsQuery() {  
    66.         return QueryBuilders.idsQuery().ids("CHszwWRURyK08j01p0Mmug", "ojGrYKMEQCCPvh75lHJm3A");  
    67.     }  
    68.   
    69.     /** 
    70.      * TODO NotSolved 
    71.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    72.      * constant score query 
    73.      * 另一个查询和查询,包裹查询只返回一个常数分数等于提高每个文档的查询。 
    74.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    75.      */  
    76.     protected static QueryBuilder constantScoreQuery() {  
    77.         /*return // Using with Filters 
    78.                 QueryBuilders.constantScoreQuery(FilterBuilders.termFilter("name", "kimchy")) 
    79.                         .boost(2.0f);*/  
    80.   
    81.         // With Queries  
    82.         return QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("name", "葫芦3033娃"))  
    83.                 .boost(2.0f);  
    84.     }  
    85.   
    86.     /** 
    87.      * TODO NotSolved 
    88.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    89.      * disjunction max query 
    90.      * 一个生成的子查询文件产生的联合查询, 
    91.      * 而且每个分数的文件具有最高得分文件的任何子查询产生的, 
    92.      * 再加上打破平手的增加任何额外的匹配的子查询。 
    93.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    94.      */  
    95.     protected static QueryBuilder disMaxQuery() {  
    96.         return QueryBuilders.disMaxQuery()  
    97.                 .add(QueryBuilders.termQuery("name", "kimchy"))          // Your queries  
    98.                 .add(QueryBuilders.termQuery("name", "elasticsearch"))   // Your queries  
    99.                 .boost(1.2f)  
    100.                 .tieBreaker(0.7f);  
    101.     }  
    102.   
    103.     /** 
    104.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    105.      * fuzzy query 
    106.      * 使用模糊查询匹配文档查询。 
    107.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    108.      */  
    109.     protected static QueryBuilder fuzzyQuery() {  
    110.         return QueryBuilders.fuzzyQuery("name", "葫芦3582");  
    111.     }  
    112.   
    113.     /** 
    114.      * TODO NotSolved 
    115.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    116.      * has child / has parent 
    117.      * 父或者子的文档查询 
    118.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    119.      */  
    120.     protected static QueryBuilder hasChildQuery() {  
    121.         return // Has Child  
    122.                 QueryBuilders.hasChildQuery("blog_tag",  
    123.                         QueryBuilders.termQuery("tag", "something"));  
    124.   
    125.         // Has Parent  
    126.         /*return QueryBuilders.hasParentQuery("blog", 
    127.                 QueryBuilders.termQuery("tag","something"));*/  
    128.     }  
    129.   
    130.     /** 
    131.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    132.      * matchall query 
    133.      * 查询匹配所有文件。 
    134.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    135.      */  
    136.     protected static QueryBuilder matchAllQuery() {  
    137.         return QueryBuilders.matchAllQuery();  
    138.     }  
    139.   
    140.     /** 
    141.      * TODO NotSolved 
    142.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    143.      * more like this (field) query (mlt and mlt_field) 
    144.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    145.      */  
    146.     protected static QueryBuilder moreLikeThisQuery() {  
    147.         // mlt Query  
    148.         QueryBuilders.moreLikeThisQuery("home", "now_home") // Fields  
    149.                 .likeText("山西省太原市7429街道")                 // Text  
    150.                 .minTermFreq(1)                                 // Ignore Threshold  
    151.                 .maxQueryTerms(12);                             // Max num of Terms  
    152.         // in generated queries  
    153.   
    154.         // mlt_field Query  
    155.         return QueryBuilders.moreLikeThisFieldQuery("home")              // Only on single field  
    156.                 .likeText("山西省太原市7429街道")  
    157.                 .minTermFreq(1)  
    158.                 .maxQueryTerms(12);  
    159.     }  
    160.   
    161.     /** 
    162.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    163.      * prefix query 
    164.      * 包含与查询相匹配的文档指定的前缀。 
    165.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    166.      */  
    167.     protected static QueryBuilder prefixQuery() {  
    168.         return QueryBuilders.prefixQuery("name", "葫芦31");  
    169.     }  
    170.   
    171.     /** 
    172.      * TODO NotSolved 
    173.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    174.      * querystring query 
    175.      *   查询解析查询字符串,并运行它。有两种模式,这种经营。 
    176.      * 第一,当没有添加字段(使用{ @link QueryStringQueryBuilder #字段(String)},将运行查询一次,非字段前缀 
    177.      *   将使用{ @link QueryStringQueryBuilder # defaultField(字符串)}。 
    178.      * 第二,当一个或多个字段 
    179.      *   (使用{ @link QueryStringQueryBuilder #字段(字符串)}),将运行提供的解析查询字段,并结合 
    180.      *   他们使用DisMax或者一个普通的布尔查询(参见{ @link QueryStringQueryBuilder # useDisMax(布尔)})。 
    181.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    182.      */  
    183.     protected static QueryBuilder queryString() {  
    184.         return QueryBuilders.queryString("+kimchy -elasticsearch");  
    185.     }  
    186.   
    187.     /** 
    188.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    189.      * range query 
    190.      * 查询相匹配的文档在一个范围。 
    191.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    192.      */  
    193.     protected static QueryBuilder rangeQuery() {  
    194.         return QueryBuilders  
    195.                 .rangeQuery("name")  
    196.                 .from("葫芦1000娃")  
    197.                 .to("葫芦3000娃")  
    198.                 .includeLower(true)     //包括下界  
    199.                 .includeUpper(false); //包括上界  
    200.     }  
    201.   
    202.     /** 
    203.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    204.      * span queries (first, near, not, or, term) 
    205.      * 跨度查询 
    206.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    207.      */  
    208.     protected static QueryBuilder spanQueries() {  
    209.         // Span First  
    210.         QueryBuilders.spanFirstQuery(  
    211.                 QueryBuilders.spanTermQuery("name", "葫芦580娃"),  // Query  
    212.                 30000                                             // Max查询范围的结束位置  
    213.         );  
    214.   
    215.         // Span Near TODO NotSolved  
    216.         QueryBuilders.spanNearQuery()  
    217.                 .clause(QueryBuilders.spanTermQuery("name", "葫芦580娃")) // Span Term Queries  
    218.                 .clause(QueryBuilders.spanTermQuery("name", "葫芦3812娃"))  
    219.                 .clause(QueryBuilders.spanTermQuery("name", "葫芦7139娃"))  
    220.                 .slop(30000)                                               // Slop factor  
    221.                 .inOrder(false)  
    222.                 .collectPayloads(false);  
    223.   
    224.         // Span Not TODO NotSolved  
    225.         QueryBuilders.spanNotQuery()  
    226.                 .include(QueryBuilders.spanTermQuery("name", "葫芦580娃"))  
    227.                 .exclude(QueryBuilders.spanTermQuery("home", "山西省太原市2552街道"));  
    228.   
    229.         // Span Or TODO NotSolved  
    230.         return QueryBuilders.spanOrQuery()  
    231.                 .clause(QueryBuilders.spanTermQuery("name", "葫芦580娃"))  
    232.                 .clause(QueryBuilders.spanTermQuery("name", "葫芦3812娃"))  
    233.                 .clause(QueryBuilders.spanTermQuery("name", "葫芦7139娃"));  
    234.   
    235.         // Span Term  
    236.         //return QueryBuilders.spanTermQuery("name", "葫芦580娃");  
    237.     }  
    238.   
    239.   
    240.     /** 
    241.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    242.      * term query 
    243.      * 一个查询相匹配的文件包含一个术语。。 
    244.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    245.      */  
    246.     protected static QueryBuilder termQuery() {  
    247.         return QueryBuilders.termQuery("name", "葫芦580娃");  
    248.     }  
    249.   
    250.   
    251.     /** 
    252.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    253.      * terms query 
    254.      * 一个查询相匹配的多个value 
    255.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    256.      */  
    257.     protected static QueryBuilder termsQuery() {  
    258.         return QueryBuilders.termsQuery("name", // field  
    259.                 "葫芦580娃", "葫芦3812娃")                 // values  
    260.                 .minimumMatch(1);               // 设置最小数量的匹配提供了条件。默认为1。  
    261.     }  
    262.   
    263.     /** 
    264.      * TODO NotSolved 
    265.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    266.      * top children  query 
    267.      * 构建了一种新的评分的子查询,与子类型和运行在子文档查询。这个查询的结果是,那些子父文档文件匹配。 
    268.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    269.      */  
    270.     protected static QueryBuilder topChildrenQuery() {  
    271.         return QueryBuilders.topChildrenQuery(  
    272.                 "blog_tag",                                 // field  
    273.                 QueryBuilders.termQuery("name", "葫芦3812娃") // Query  
    274.         )  
    275.                 .score("max")                               // max, sum or avg  
    276.                 .factor(5)  
    277.                 .incrementalFactor(2);  
    278.     }  
    279.   
    280.     /** 
    281.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    282.      * wildcard query 
    283.      *   实现了通配符搜索查询。支持通配符* < /tt>,<tt> 
    284.      *   匹配任何字符序列(包括空),<tt> ? < /tt>, 
    285.      *   匹配任何单个的字符。注意该查询可以缓慢,因为它 
    286.      *   许多方面需要遍历。为了防止WildcardQueries极其缓慢。 
    287.      *   一个通配符词不应该从一个通配符* < /tt>或<tt> 
    288.      *   < /tt> <tt> ?。 
    289.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    290.      */  
    291.     protected static QueryBuilder wildcardQuery() {  
    292.         return QueryBuilders.wildcardQuery("name", "葫芦*2娃");  
    293.     }  
    294.   
    295.     /** 
    296.      * TODO NotSolved 
    297.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    298.      * nested query 
    299.      * 嵌套查询 
    300.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    301.      */  
    302.     protected static QueryBuilder nestedQuery() {  
    303.         return QueryBuilders.nestedQuery("location",               // Path  
    304.                 QueryBuilders.boolQuery()                      // Your query  
    305.                         .must(QueryBuilders.matchQuery("location.lat", 0.962590433140581))  
    306.                         .must(QueryBuilders.rangeQuery("location.lon").lt(0.00000000000000000003))  
    307.         )  
    308.                 .scoreMode("total");                  // max, total, avg or none  
    309.     }  
    310.   
    311.     /** 
    312.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    313.      * indices query 
    314.      * 索引查询 
    315.      * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    316.      */  
    317.     protected static IndicesQueryBuilder indicesQuery() {  
    318.         // Using another query when no match for the main one  
    319.         QueryBuilders.indicesQuery(  
    320.                 QueryBuilders.termQuery("name", "葫芦3812娃"),  
    321.                 Es_Utils.INDEX_DEMO_01, "index2"  
    322.         )       //设置查询索引上执行时使用不匹配指数  
    323.                 .noMatchQuery(QueryBuilders.termQuery("age", "葫芦3812娃"));  
    324.   
    325.   
    326.         // Using all (match all) or none (match no documents)  
    327.         return QueryBuilders.indicesQuery(  
    328.                 QueryBuilders.termQuery("name", "葫芦3812娃"),  
    329.                 Es_Utils.INDEX_DEMO_01, "index2"  
    330.         )      // 设置不匹配查询,可以是 all 或者 none  
    331.                 .noMatchQuery("none");  
    332.     }  
    333.   
    334.   
    335.   
    336.   
    337.     public static void main(String[] args) {  
    338.         Es_Utils.startupClient();  
    339.         try {  
    340.             searchTest(indicesQuery());  
    341.         } catch (Exception e) {  
    342.             e.printStackTrace();  
    343.         } finally {  
    344.             Es_Utils.shutDownClient();  
    345.         }  
    346.     }  
    347.   
    348.     private static void searchTest(QueryBuilder queryBuilder) {  
    349.         //预准备执行搜索  
    350.         Es_Utils.client.prepareSearch(Es_Utils.INDEX_DEMO_01)  
    351.                 .setTypes(Es_Utils.INDEX_DEMO_01_MAPPING)  
    352.                 .setQuery(queryBuilder)  
    353.                 .setFrom(0).setSize(20).setExplain(true)  
    354.                 .execute()  
    355.                         //注册监听事件  
    356.                 .addListener(new ActionListener<SearchResponse>() {  
    357.                     @Override  
    358.                     public void onResponse(SearchResponse searchResponse) {  
    359.                         Es_Utils.writeSearchResponse(searchResponse);  
    360.                     }  
    361.   
    362.                     @Override  
    363.                     public void onFailure(Throwable e) {  
    364.   
    365.                     }  
    366.                 });  
    367.     }  
    368. }  
  • 相关阅读:
    jhljx跑跑跑(找规律)
    FFT教你做乘法(FFT傅里叶变换)
    寻找最远点对(凸包求解)
    捡火柴的Nova君(n个线段相交问题)
    生命游戏/Game of Life的Java实现
    如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】(转)
    北航第十一届程序设计竞赛网络预赛题解
    LeetCode 3 Longest Substring Without Repeating Characters(最长不重复子序列)
    UVa 112
    LeetCode 2 Add Two Numbers(链表操作)
  • 原文地址:https://www.cnblogs.com/tutu21ybz/p/6836446.html
Copyright © 2020-2023  润新知