簡體   English   中英

如何在 spring 引導中使用 RestHighLevelClient 根據條件從彈性搜索索引中搜索數據

[英]How to search data based on condition from elastic search index using RestHighLevelClient in spring boot

如何在 spring 啟動時使用 RestHighLevelClient 從彈性搜索索引中根據條件搜索數據。 對於下面的例子。

案例 1:如果我搜索“公司名稱”(例如:“DEFG”)。 我的 output 應該得到所有匹配的數據“company_name/address3”(例如:DEFG/smp1、DEFG/chtp2、DEFG/gmd、DEFG/tste)

情況 2:如果我使用“address3”(例如:“smp1”)進行搜索。我的 output 應該只是“company_name/address3(例如:”DEFG/smp1)。

"_index" : "es_52_companydetails_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "company_id" : "3",
          "company_name" : "DEFG",
          "companyaddress" : [
            {
              "address3" : "smp1",
              "main_phone1" : "1"
            },
            {
              "address3" : "chtp2",
              "main_phone1" : "2"
            },
            {
              "address3" : "gmd",
              "main_phone1" : "3"
            },
            {
              "address3" : "tste",
              "main_phone1" : "4"
            }
          ]
        }

情況1:

{
  "query": {
    "match": {
      "company_name": "DEFG"
    }
  }
}

案例1 Java:

RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        SearchRequest searchRequest = new SearchRequest("company");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("company_name", "DEFG"));
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse.toString());

情況 2:您可以使用script_field實現此目的。 您還需要將相同的查詢傳遞給 if 條件。 因此它將生成僅包含與您的查詢匹配的地址的新字段。

{
  "_source": {
    "excludes": "name"
  }, 
  "query": {
    "match": {
      "companyaddress.address3": "smp1"
    }
  },
  "script_fields": {
    "address": {
      "script": {
        "lang": "painless",
        "source": """
      List li = new ArrayList();
      if(params['_source']['companyaddress'] != null)
      {
        for(p in params['_source']['companyaddress'])
        {
          if( p.address3 == 'smp1')
            li.add(p);
        }
      }
      return li;
      """
      }
    }
  }
}

案例 2 響應:請查看具有與查詢匹配的地址的字段標簽。

 {
        "_index" : "company",
        "_type" : "_doc",
        "_id" : "101",
        "_score" : 0.6548753,
        "_source" : {
          "companyaddress" : [
            {
              "address3" : "smp1",
              "main_phone1" : "1"
            },
            {
              "address3" : "chtp2",
              "main_phone1" : "2"
            },
            {
              "address3" : "gmd",
              "main_phone1" : "3"
            },
            {
              "address3" : "tste",
              "main_phone1" : "4"
            }
          ],
          "company_id" : "3",
          "company_name" : "DEFG"
        },
        "fields" : {
          "address" : [
            {
              "address3" : "smp1",
              "main_phone1" : "1"
            }
          ]
        }
      }

案例2 Java:

RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        SearchRequest searchRequest = new SearchRequest("company");
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("companyaddress.address3", "smp1"));

        Map<String, Object> param = new HashMap<String, Object>();

        String source = "List li = new ArrayList();if(params['_source']['companyaddress'] != null){for(p in params['_source']['companyaddress']){if( p.address3 == 'smp1')li.add(p);}}return li;";
        Script script = new Script(ScriptType.INLINE, "painless", source, param);

        sourceBuilder.scriptField("address", script);
        sourceBuilder.fetchSource(true);
        searchRequest.source(sourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse.toString());
        client.close();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM