跳至主要內容

Elasticsearch全局搜索

xw小于 1 分钟ElasticsearchElasticsearch

1.原理

  1. 使用copy_to将需要查询的参数值复制到一个属性中
  2. 使用wildcard关键词进行查询

2.实现

  1. 创建索引,将所有string类型的数据复制到cmp_full_name中

    PUT /cmdb/
    {
      "mappings" : {
            "dynamic_templates" : [
            {
              "copy_to_full":{
                "mapping": {
                  "copy_to": "cmp_full_name"
                },
                "match_mapping_type": "string",
                "unmatch":"cmp_full_name"
              }
            },
            {
              "message_field" : {
                "path_match" : "message",
                "match_mapping_type" : "string",
                "mapping" : {
                  "norms" : false,
                  "type" : "text"
                }
              }
            },
            {
              "string_fields" : {
                "match" : "*",
                "match_mapping_type" : "string",
                "mapping" : {
                  "analyzer" : "simple",
                  "norms" : false,
                  "type" : "text"
                }
              }
            }
          ],
          "properties": {
            "cmp_full_name":{
              "type": "keyword"
            }
          }
        }
    }
    
  2. 代码关键实现

      String key = "*" + cmdbGlobalSearchQueryVo.getKeyword() + "*";
                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
                WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("cmp_full_name", key);
                boolQueryBuilder.should(wildcardQueryBuilder);