2、可行性
1、Elasticsearch對中文的處理,反向索引的前置條件就是中文分詞。
而分詞,我們常用的就是IK分詞插件。
2、正常ES的部署、開發設計時候就提前選好分詞器。
綜上,借助Elasticsearch實作分詞完全沒有問題。
2、Elasticsearch中的DSL實作
GET test_index/_analyze
{
"analyzer":"ik_smart",
"text":"9年後,我還是沒有跑出去 | 震後餘生"
}
1
2
3
4
5
傳回結果:
"tokens": [
{
"token": "9",
"start_offset": 0,
"end_offset": 1,
"type": "ARABIC",
"position": 0
},
"token": "年後",
"start_offset": 1,
"end_offset": 3,
"type": "CN_WORD",
"position": 1
"token": "我",
"start_offset": 4,
"end_offset": 5,
"position": 2
"token": "還是",
"start_offset": 5,
"end_offset": 7,
"position": 3
"token": "沒有",
"start_offset": 7,
"end_offset": 9,
"position": 4
"token": "跑出去",
"start_offset": 9,
"end_offset": 12,
"position": 5
"token": "震後",
"start_offset": 15,
"end_offset": 17,
"position": 6
"token": "餘生",
"start_offset": 17,
"end_offset": 19,
"position": 7
}
]
}3、Elasticsearch Java接口實作
以下是基于Jest5.3.3的接口實作。
/*
*@brief:擷取分詞結果接口
*@param:待分詞的文章/字元串
*@return:不重複分詞結果集(可根據實際業務場景二次開發)
*@date:20180704
*/
public static String IK_TYPE = "ik_smart";
public static Set<String> getIkAnalyzeSearchTerms(String searchContent) {
// 調用 IK 分詞分詞
JestClient client = JestHelper.getClient();
Analyze ikAnalyze = new Analyze.Builder()
.index(TEST_INDEX)
.analyzer(IK_TYPE)
.text(searchContent)
.build();
JestResult result = null;
Set<String> keySet = new HashSet<String>();
try {
result = client.execute(ikAnalyze);
JsonArray jsonArray = result.getJsonObject().getAsJsonArray("tokens");
int arraySize = jsonArray.size();
for (int i = 0; i < arraySize; ++i) {
JsonElement curKeyword = jsonArray.get(i).getAsJsonObject().get("token");
//Logger.info("rst = " + curKeyword.getAsString());
keySet.add(curKeyword.getAsString());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return keySet;
}
有了java接口,對外提供Restful API就變得相對簡單了。
4、小結
充分挖據Elasticsearch自身特性,優化、簡化業務場景才是王道!