elasticsearch插入索引文檔 對數字字符串的處理


 

對於字符串在搜索匹配的時候,字符串是數字的話需要匹配的是精准匹配,如果是部分匹配字符串的話,需要進行處理,把數字型字符串作為一個字符中的數組表示插入之后顯示如下:


如果插入之后顯示如畫線部分的話,則表示精准匹配

在用clien的java api插入的時候:

            String json=null;
            if (req.getTagId() != null) {
            String[] test = req.getTagId().split(",");
            json = JSON.toJSONString(test);
            System.out.println(json);
            }else {
             json = "{"+"\"location\":"+"\""+req.getLatitude()+","+req.getLongitude()+"\""+","
                            +"\"id\":"+"\""+req.getId()+"\""+","+"\"union_id\":"+"\""+req.getUnionId()+"\""+","
                            +"\"tag_id\":"+"\""+req.getTagId()+"\""+","+"\"tag_name\":"+"\""+req.getTagName()+"\""+","
                            +"\"nickname\":"+"\""+req.getNickname()+"\""+","+"\"phone\":"+"\""+req.getPhone()+"\""+","
                            +"\"name\":"+"\""+req.getName()+"\""+","+"\"age\":"+"\""+req.getAge()+"\""+","
                            +"\"code\":"+"\""+req.getCode()+"\""+","+"\"gender\":"+"\""+req.getGender()+"\""+","
                            +"\"province\":"+"\""+req.getProvince()+"\""+","+"\"city\":"+"\""+req.getCity()+"\""+","
                            +"\"coountry\":"+"\""+req.getCountry()+"\""+","+"\"avatarUrl\":"+"\""+req.getAvatarUrl()+"\""+","
                            +"\"app_code\":"+"\""+req.getAppCode()+"\""+"}";
                            System.out.println(json);
            }

 

 

 

 通過這種插入方式,默認的是json,在json驗證的時候顯示的json,而在table格式下不能顯示:因此通過類的字符形式插入在顯示table格式:

    public boolean insertIndexUserDoc(String indexname, String type,List<UserEntity> list)
            throws ApplicationException, Exception {
        // TODO Auto-generated method stub
        String location=null;
        JestClient jestHttpClient = Connection.getClient();
        JestResult jr = null;
        try {
            
//        Bulk.Builder bulk = new Bulk.Builder().defaultIndex(indexname)
//                .defaultType(type);
        for(UserEntity req:list){
            UserEntity user = new  UserEntity();
            user.setId(req.getId());
            user.setUnionId(req.getUnionId());
            user.setTagName(req.getTagName());
            user.setLocation(req.getLatitude().toString()+","+req.getLongitude().toString());
            user.setAge(req.getAge());
            user.setPhone(req.getPhone());
            user.setCode(req.getCode());
            user.setGender(req.getGender());
            user.setProvince(req.getProvince());
            user.setCity(req.getCity());
            user.setCountry(req.getCountry());
            user.setAppCode(req.getAppCode());
            user.setAvatarUrl(req.getAvatarUrl());
            user.setNickname(req.getNickname());
            if (req.getTagId()!=null){
                  String[] mids=req.getTagId().split(",");
                  user.setTagId(JSON.toJSONString(mids));;
            }
             jr=jestHttpClient.execute(new Index.Builder(user)
                .index("omouserinfo").id(user.getId())
                .type("omouserinfo").build());
             boolean flag = jr.isSucceeded();
                System.out.println(flag);
        }
        return true;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return false;
        }    
    }

其中,      jr=jestHttpClient.execute(new Index.Builder(user)
                .index("omouserinfo").id(user.getId())
                .type("omouserinfo").build());這個設置的id,如果不設置,在批量插入處理的時候,id第一次自動分配,后面容易沖突

第一段
代碼如果批量插入時候可以不設置id,由於id可以在一次之后自增id,不需要設置id;因此,在批量單條處理的時候需要加id。執行之后如下:

在查詢的時候實現精准匹配:

 

做查詢的時候需要對字符串進行處理如下:

ublic static void main(String[] args) {
        int from = 0, size = 100;
        String serviceTypeIds = "823,770,1182,1431,1432";
        System.out.println(serviceTypeIds);
        StringBuilder stringBuilder = new StringBuilder("{")
                .append("\"from\":")
                .append(from)
                .append(",")
                .append("\"size\":")
                .append(size)
                .append(",")
                .append("\"query\" : {")
                .append("\"match_all\" : {}")
                .append("},")
                .append("\"filter\" : {\"and\" : [")
                .append(org.apache.commons.lang3.StringUtils
                        .isBlank(serviceTypeIds) ? "" : (serviceTypeIds
                        .contains(",") ? "{\"query_string\" : {\"query\" : \""
                        + StringUtils.replace(serviceTypeIds, ",", " or ")
                        + "\",\"fields\":[\"tagId\"]}}"
                        : "{\"term\" : {\"tagId\" : " + serviceTypeIds
                                + "}},"));
        System.out.println(stringBuilder);
    }

 

花了一上午的時間,做出來,小小激動一下啊!

 打印出來的json如下:

{
  "from": 0,
  "size": 100,
  "query": {
    "match_all": {}
  },
  "filter": {
    "query_string": {
      "query": "2 or1 ",
      "fields": [
        "tagId"
      ]
    }
  }
}

查詢結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM