【问题标题】:How to search data based on condition from elastic search index using RestHighLevelClient in spring boot如何在spring boot中使用RestHighLevelClient根据弹性搜索索引中的条件搜索数据
【发布时间】:2021-10-26 05:52:33
【问题描述】:

如何在 spring boot 中使用 RestHighLevelClient 根据弹性搜索索引中的条件搜索数据。下面的例子。

案例 1:如果我使用 "company_name" (ex:"DEFG") 进行搜索。我的输出应该是所有匹配的数据“company_name/address3”(例如:DEFG/smp1、DEFG/chtp2、DEFG/gmd、DEFG/tste)

案例 2:如果我使用“address3”(例如:“smp1”)进行搜索。我的输出应该只有“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"
            }
          ]
        }

【问题讨论】:

    标签: spring-boot elasticsearch search resthighlevelclient


    【解决方案1】:

    案例 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();
    

    【讨论】:

    • 我想解决我的问题是使用 RestHighLevelClient 。所以请提供2个案例的代码。我是这个弹性搜索概念的新手。谢谢提前
    • @Dorayya 请立即查看。我为java添加了代码。如果这对您有帮助,则将答案标记为解决方案并进行投票。
    • QueryBuilders.matchQuery("companyaddress.address3", "smp1")
    • @Dorayya 这不是你要找的吗?
    • QueryBuilders.matchQuery("companyaddress.address3", "smp1") matchQuery 中的第一个参数是 dynamic 。表示我的搜索词可以属于 "company_name or companyaddress.address3" 。实际上在我的最后我有 String[] ,它包含所有带有嵌套的字段名称,例如: String [] columnsToBeSearched = {"company_id","company_name","companyaddress.address1"}
    猜你喜欢
    • 2021-10-24
    • 2012-09-07
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2014-11-04
    • 2018-02-01
    相关资源
    最近更新 更多