最近业务中有遇到使用es进行全文检索,记录一下学习的结果
1、使用DSL进行es查询的方法
1.1、match_all查询所有(二者是等价的)
GET /test_match/_search
{
"query": {
"match_all": {
}
}
}
GET /test_match/_search
1.2、match搜索(分词搜索)
先对搜索词分词,再进行分词搜索
GET /test_match/_search
{
"query": {
"match": {
"name":"张三"
}
}
}
1.3、match_pharse搜索(模糊搜索)
短语搜索, 要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致**
GET /test_match/_search
{
"query": {
"match_phrase": {
"name": "张三"
}
}
}
2、对于上面的几种方法都不太适用,我希望有一个方法对文档的所有属性进行检索,而不需要我手动指定检索属性。于是有以下方法:
GET /test_match/_search
{
"query": {
"query_string": {
"query": "*home*"
}
}
}
3、借助java的API实现全文检索
public List<JSONObject> getByFullTextSearch() throws IOException {
ArrayList<JSONObject> list = new ArrayList<>();
SearchRequest request = new SearchRequest("test_match");
request.source().query(QueryBuilders.queryStringQuery("home"));
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
String json = hit.getSourceAsString();
JSONObject jsonObject = JSONObject.parseObject(json);
list.add(jsonObject);
}
return list;
}
输出结果为: