Elasticsearch查詢常見問題
1、實現(xiàn)mysql中的like查詢效果
使用 NGram 分詞器作為字段的分詞器,可在索引創(chuàng)建時指定,也可以更新映射關(guān)系,以下展示如何在索引創(chuàng)建時指定 NGram 分詞器。
{
"settings": {
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "ngram_tokenizer"
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "ngram",
"min_gram": 1,
"max_gram": 30,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"_default_": {
"properties": {
"Name": {
"type": "string",
"analyzer": "ngram_analyzer"
}
}
}
}
}
2、當(dāng)需要在一個字段上同時進行模糊查詢、排序時
可以指定2個分詞器
"mappings": {
"_default_": {
"properties": {
"Name": {
"type": "string",
"analyzer": "ngram_analyzer",
"fields": {
"raw": {
"type": "keyword" }
}
}
}
}
}
對Name.raw進行排序
3、解決 Elasticsearch 超過 10000 條無法查詢的問題
方法一:重建索引,修改最大顯示數(shù)據(jù)大小
具體操作命令,如下(比如,設(shè)置可查詢 200000000 條數(shù)據(jù),其中 alarm 是index名稱):
PUT alarm/_settings
{
"max_result_window" : 200000000
}
方法二:使用es自帶的scroll分頁支持
初始化查詢
//構(gòu)建查詢條件(非必須)
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("rate_object","item"));
RangeQueryBuilder publishDateBuilder = QueryBuilders.rangeQuery("created_at");
publishDateBuilder.from("2018-04-22 00:00:00");//格式需要同你創(chuàng)建索引時的格式匹配
boolQueryBuilder.filter(publishDateBuilder);
TransportClient client = factory.getClient();
SearchResponse response = client.prepareSearch("index")//對應(yīng)索引
.setTypes("type")//對應(yīng)索引type
.setQuery(boolQueryBuilder)
.setScroll(TimeValue.timeValueMinutes(10))//設(shè)置查詢context的存活時間
.setSize(100)
.execute()
.actionGet();
迭代查詢
while (response.getHits().getHits().length>0) {
String scrollId = response.getScrollId();
response = client.prepareSearchScroll(scrollId)
.setScroll(TimeValue.timeValueMinutes(10))//設(shè)置查詢context的存活時間
.execute()
.actionGet();
SearchHits hits = response.getHits();
for (SearchHit hit:hits.getHits()) {
String hitString = hit.getSourceAsString();
System.out.println(hitString);//此處可進行業(yè)務(wù)邏輯
}
}
clean scroll
ClearScrollRequest request = new ClearScrollRequest();
request.addScrollId(response.getScrollId());
client.clearScroll(request);