對於字符串在搜索匹配的時候,字符串是數字的話需要匹配的是精准匹配,如果是部分匹配字符串的話,需要進行處理,把數字型字符串作為一個字符中的數組表示插入之后顯示如下:
如果插入之后顯示如畫線部分的話,則表示精准匹配
在用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"
]
}
}
}
查詢結果如下: