• elasticsearch Terms Query 实现类似于sql in查询


    本文demo基于elasticsearch 5.1.1,  项目中使用的还是较早的版本

    例如

    import com.alibaba.fastjson.JSON;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.index.query.BoolQueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.transport.client.PreBuiltTransportClient;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.HashSet;
    import java.util.Set;
    
    public class ElasticSearchMain {
    
        public static void main(String[] args) throws UnknownHostException {
    
            TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.7.61"), 9300));
            //继续添加其他地址
    
            Set set = new HashSet<String>();
            set.add("3503027400038206");
            set.add("3503227700038105");
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
            boolQuery.must(QueryBuilders.termsQuery("pt_number", set));
    
            SearchResponse response = client.prepareSearch("pt_0628").setTypes("lw_point_location").setQuery(boolQuery)
                    .setSize(10000).execute().actionGet();
    
            for(SearchHit hit : response.getHits().getHits()){
                System.out.println(JSON.toJSONString(hit.getSource()));
            }
    
            //on shutdown
            client.close();
        }
    
    }

    以上可以查询索引类型中对应的字段是

    3503027400038206、
    3503227700038105 的数据。

    此外terms query 还可查询字段的值包含在另外一个索引类型的字段之中。

    如, 在kibana中运行:
    PUT /users/user/2
    {
        "followers" : ["1", "3"]
    }

    建一个users索引, 有一个类型是user,  id为 2。

    有个followers字段,是数组。

    PUT /tweets/tweet/1
    {
        "user" : "1"
    }

    建一个tweets索引。其类型是tweet, id为1.

    然后查询tweets索引tweet类型中,user字段的值包含在users索引user类型的数组中

    
    
    GET /tweets/_search
    {
        "query" : {
            "terms" : {
                "user" : {
                    "index" : "users",
                    "type" : "user",
                    "id" : "2",
                    "path" : "followers"
                }
            }
        }
    }

    结果:

    {
      "took": 2,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
          {
            "_index": "tweets",
            "_type": "tweet",
            "_id": "1",
            "_score": 0.2876821,
            "_source": {
              "user": "1"
            }
          }
        ]
      }
    }

    可以通过Java 发送http请求去查询。

    
    
    import org.apache.http.HttpHost;
    import org.apache.http.entity.ContentType;
    import org.apache.http.nio.entity.NStringEntity;
    import org.apache.http.util.EntityUtils;
    import org.elasticsearch.client.Response;
    import org.elasticsearch.client.RestClient;
    
    import java.util.Collections;
    
    public class JavaTermsHttp {
        public static void main(String[] args) throws Exception {
    
            RestClient restClient = RestClient.builder(
                    new HttpHost("192.168.7.61", 9200, "http")).build();
    
            Response response = restClient.performRequest("POST", "/tweets/_search", Collections.<String, String>emptyMap(),
                    new NStringEntity("{
    " +
                            "    "query" : {
    " +
                            "        "terms" : {
    " +
                            "            "user" : {
    " +
                            "                "index" : "users",
    " +
                            "                "type" : "user",
    " +
                            "                "id" : "2",
    " +
                            "                "path" : "followers"
    " +
                            "            }
    " +
                            "        }
    " +
                            "    }
    " +
                            "}", ContentType.APPLICATION_JSON));
    
            System.out.println(EntityUtils.toString(response.getEntity()));
            restClient.close();
    
        }
    }



  • 相关阅读:
    "#"
    网络请求
    iOS_正则表达式判断手机型号、邮箱、手机号、身份证、昵称、密码等
    程序员
    js交互
    android 性能优化
    Android 开源的项目框架
    Android 开源框架案例
    Android Listview上拉刷新加载框架
    android 上传文件到服务器FIP
  • 原文地址:https://www.cnblogs.com/chenmz1995/p/11248769.html
Copyright © 2020-2023  润新知