欢迎投稿

今日深度:

Elasticsearch的查询说明,elasticsearch

Elasticsearch的查询说明,elasticsearch


1、Elasticsearch查询
1.1 通配符查询
wildcard是通配符查询,它和prefix查询类似,也是一个基于词条的低级别查询。但是它能够让你指定一个模式(Pattern),而不是一个前缀(Prefix)。它使用标准的shell通配符:?用来匹配任意字符,*用来匹配零个或者多个字符。

//以下查询能够匹配包含W1F 7HW和W2F 8HW的文档:
GET /my_index/address/_search
{
    "query": {
        "wildcard": {
            "postcode": "W?F*HW" 
        }
    }
}

1.2 正则表达式查询
regexp是正则表达式查询。假设现在你想匹配在W地域(Area)的所有邮政编码。使用前缀匹配时,以WC开头的邮政编码也会被匹配,在使用通配符查询时也会遇到类似的问题。我们只想匹配以W开头,紧跟着数字的邮政编码。使用regexp查询能够让你写下更复杂的模式:

GET /my_index/address/_search
{
    "query": {
        "regexp": {
            "postcode": "W[0-9].+" 
        }
    }
}

这个正则表达式的规定了词条需要以W开头,紧跟着一个0到9的数字,然后是一个或者多个其它字符。

wildcard和regexp查询的工作方式和prefix查询完全一样。它们也需要遍历倒排索引中的词条列表来找到所有的匹配词条,然后逐个词条地收集对应的文档ID。它们和prefix查询的唯一区别在于它们能够支持更加复杂的模式。

尽管对于前缀匹配,可以在索引期间准备你的数据让它更加高效,通配符和正则表达式匹配只能在查询期间被完成。虽然使用场景有限,但是这些查询也有它们的用武之地。

注意:
prefix,wildcard以及regexp查询基于词条进行操作。如果你在一个analyzed字段上使用了它们,它们会检查字段中的每个词条,而不是整个字段。比如,假设我们的title字段中含有”Quick brown fox”,它会产生词条quick,brown和fox。

//这个查询能够匹配:
{ "regexp": { "title": "br.*" }}
//而不会匹配:
{ "regexp": { "title": "Qu.*" }} 
{ "regexp": { "title": "quick br*" }}

1.3 match_all:直接请求全部;
1.4 terms : 精确匹配多个关键字,如

curl -XGET 'http:///localhost:9400/index_test/_search?pretty=true' -d '{query: {terms: {name: ["zhang", "zhangyan"]}}} }' 

1.5 term:是严格相等的查询,例如查找中国人民,那么他就是使用中国人民去查询。使用term查询,如果该字段是不分词,只有完整的输入目标字段,才能正确的匹配。

1.6 text:是片段查询,例如查找中国人民,那么他有可能是用“中国”,“人民”去查询 。

1.7 range : 根据范围查询。如果type是时间格式,可以使用内置的now表示当前,参数有from、 to、 include_lower、 include_upper、gt、gte、lt、lte。 如

"range" : { "age" : { "from" : 10, "to" : 20 } } 

1.8 filter:过滤,这个查询很快,因为不需要执行打分过程,query参数,在filter中也都存在。此外,还有比较重要的参数就是连接操作:

curl -XGET 'http:///localhost:9400/index_test/_search?pretty=true' -d '{query: {wildcard: { name: "*z*" }}, filter: {range: {id: {from: 1, to: 10}} } }' 

1.9 missing:返回没有字段或值为null或没有值的文档。
1.10 prefix:匹配分词前缀,如果字段没分词,就匹配整个字段前缀。

2、JavaClient查询Elasticsearch

QueryBuilder queryBuilder = QueryBuilders.termQuery("字段","term值");
SearchResponse response = client.prepareSearch("索引名称")
            .setTypes("type名称")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
            .setQuery(queryBuilder)
            .execute()
            .actionGet();
/*获取结果
System.out.println(response.getHits().totalHits());
//获取响应字符串
System.out.println(response.toString());
//遍历查询结果输出相关度分值和文档内容
SearchHits searchHits =  response.getHits();
for(SearchHit searchHit : searchHits){
    System.out.println(searchHit.getScore());
    System.out.println(searchHit.getSourceAsString());
}


//1、term query:分词精确查询,查询hotelName 分词后包含 hotel的term的文档
QueryBuilders.termQuery("hotelName","hotel")

//2、terms Query:多term查询,查询hotelName包含hotel或tes 中的任何一个或多个的文档
QueryBuilders.termsQuery("hotelName","hotel","test")

//3、range query:范围查询 查询hotelNo,
QueryBuilders.rangeQuery("hotelNo")
        .gt("10143262306")                //大于
        .lt("101432623062055348221")    //小于
        .includeLower(true)             //包括下界
        .includeUpper(false);             //包括上界

//4、exist query:查询字段不为null的文档。查询字段address 不为null的数据
QueryBuilders.existsQuery("address")

//5、missing query:返回没有字段或值为null或没有值的文档。
QueryBuilders.missingQuery("accountGuid")
//java client标记该方法已经过时,推荐用exist代替 如下
QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("accountGuid"));

//6、prefix query:匹配分词前缀 如果字段没分词,就匹配整个字段前缀
QueryBuilders.prefixQuery("hotelName","花园")

//7、wildcard query:通配符查询,支持* 任意字符串;?任意一个字符
QueryBuilders.wildcardQuery("channelCode","ctr*")
QueryBuilders.wildcardQuery("channelCode","c?r?")

//8、regexp query:正则表达式匹配分词
QueryBuilders.regexpQuery()

//9、fuzzy query:分词模糊查询,通过增加fuzziness模糊属性来查询,如能够匹配hotelName为tel前或后加一个字母的文档,fuzziness 的含义是检索的term 前后增加或减少n个单词的匹配查询
QueryBuilders.fuzzyQuery("hotelName", "tel").fuzziness(Fuzziness.ONE)

//10、idx Query:根据ID查询
QueryBuilders.idsQuery().addIds("exchange_operate_monitor_db$32293","exchange_operate_monitor_db$32294")

//11、match query:直接请求全部
QueryBuilders.matchQuery();//查询匹配会进行分词
QueryBuilders.matchAllQuery();//查询匹配会进行分词

//12、布尔查询
QueryBuilders.boolQuery()
QueryBuilders.boolQuery().must();//文档必须完全匹配条件,相当于and
QueryBuilders.boolQuery().mustNot();//文档必须不匹配条件,相当于not
QueryBuilders.boolQuery().should();//至少满足一个条件,这个文档就符合should,相当于or

//13、以一个短语的形式查询,完全匹配查询
QueryBuilders.matchPhraseQuery()

3、分词对于查询的影响
3.1 对于分词的字段
(1)如果查询的是单个词,则查询到包含它的文档,返回结果与匹配程度有关
(2)如果查询的是多个词即一段能被分析的词,比如hello world。那么查询的结果是包含分析得出的词的文档,包含hello或world的全部文档。

3.2 对于不分词的字段
只有查询的是目标字段的精确值,才能匹配。比如hello world,必须查询hello world,才可以找到文档。

www.htsjk.Com true http://www.htsjk.com/Elasticsearch/30784.html NewsArticle Elasticsearch的查询说明,elasticsearch 1、Elasticsearch查询 1.1 通配符查询 wildcard是通配符查询,它和prefix查询类似,也是一个基于词条的低级别查询。但是它能够让你指定一个模式(Pattern),而...
相关文章
    暂无相关文章
评论暂时关闭