elasticsearch学习篇之四数据查询

以上三篇分别讲解了elasticsearch的原理介绍,索引创建,数据导入,都是基本内容,深入了解还需小伙伴自己钻研.

本文将为大家介绍elasticsearch数据查询,如何在全部文档中搜索到最相关的文档。不同于SQL语言,对ElasticSearch引擎发送的查询请求,有两种方式:第一种方式是使用RESTful 风格的API请求对数据进行搜索或更新,这意味着,必须使用搜索API向ElasticSearch引擎发起搜索请求;第二种方式是使用Qeury DSL,将查询语言封装成JSON结构,在JSON结构中,封装查询请求的参数,作为请求主体(Request Body),发送给ElasticSearch引擎处理。
后面将为大家介绍如何用代码来实现搜索。
接下来先介绍DSL语句 的搜索,该搜索方式在kibana上完成

1.精确查找:当进行精确值查找时, 使用过滤器(filters)。过滤器很重要,因为它们执行速度非常快,不会计算相关度(直接跳过了整个评分阶段)而且很容易被缓存。我们会在本章后面的 过滤器缓存 中讨论过滤器的性能优势,不过现在只要记住:请尽可能多的使用过滤式查询。
term查询
DSL语句

GET /my_index/doc/_search {
“query” : {
“constant_score” : {
“filter” : {
“term” : {
“sex” : “男”
}
}
}
} }

结果

“hits” : [
{
“_index” : “my_index”,
“_type” : “doc”,
“_id” : “2”,
“_score” : 1.0,
“_source” : {
“sex” : ‘男’,
……(剩余字段)
}
} ]

该查询不对查询进行算分,默认算分都为1
以上查询相当于sql语句的
select * from user where sex=‘男’
2.1中的例子查询单个字段,如果我们查询要对多个字段查询该如何解决,用bool复合过滤器

GET /my_store/products/_search { “query” : {
“filtered” : {
“filter” : {
“bool” : {
“must” : [
{ “term” : {“name” : “susu”}}
],
“should” : [
{ “term” : {“sex” : “男”}}
],
“must_not” : {
“term” : {“city” : “武威”}
}
}
}
} } }

must
所有的语句都 必须(must) 匹配,与 AND 等价。
must_not
所有的语句都 不能(must not) 匹配,与 NOT 等价。
should
至少有一个语句要匹配,与 OR 等价。
以上DSL语句相当于sql语句 select * from user where name = “susu” or sex=”男” and city !=”武威”

如果想进行范围过滤可以下面方法

“range” : {
“id” : {
“gte” : 2,
“lte” : 10
} }

用sql语句写为select * from user where id between 1 and 5
gt: > 大于
lt: < 小于
gte: >= 大于或等于
lte: <= 小于或等于
精确查询介绍了
2.以上介绍了精确查询,下面介绍如何通过匹配查询来进行全文检索。

GET /my_index/doc/_search {
“query”: {
“match”: {
“title”: “中国”
}
} }

进行全文检索的时候首先要对要检索的字段进行分词,具体如何分词请看elasticsearch学习篇之二索引的创建,如果我们查找的关键词为中国,elasticsearch会在所有文档中查询”中国”相关的词,并对这些文档进行先关性算分,具体内部算分规则,请查看相关文档。
如果设计到需要重新定义打分规则的时候,需要function_score(用来重新定义算分规则)具体写法如下。

get my_index/doc/_search { “explain”:true, //可以查看具体的执行规则 “query”:
{
“function_score”: {
“query”: {
“bool”: {
“must”: [
{
“match”: {
“title”: “中国”
}
}
]
}
},
“functions”: [
{
“script_score”: {
“script”: “(_score)+(doc[“id”].value+1)”
}
},
{
“script_score”: {
“script”: “(1)”
}
}
]
} } }

上例介绍了如何快速的查询,其中涉及到简单算分规则,script_score中doc[“id”].value,根据字段的值重新定义算分,如果是对一些文档的查询,还可以按照文档下载量,点击量来影响该文档的分值,从而提高文档的排序值,这样就能更快的查找出我们需要的目标文档。

如何使用代码来操作elasticsearch进行数据查询,首先安装 elasticsearch-php
1.新建composer.json ,内容如下

{
“require”: {
“elasticsearch/elasticsearch”: “~6.0”
} }

2.用composer 安装

curl -s http://getcomposer.org/installer | php php composer.phar
install –no-dev

如果在windows下遇上curl不是本地命令,需要安装curl
安装完成之后把下载的依赖存储在 /vendor/ 目录下,并且创建一个 autoloader

3.实例化客户端

$hosts = [
        'ip地址:端口号'
    ];
$client = ClientBuilder::create()->setHosts($hosts)->build();
    return $client;

4.创建索引条件

    $params = array();
    $params['index'] = 'my_index';//索引名称
    $params['type']  = 'doc';  //索引类型
    $params['body']['from'] = 1;
    $params['body']['size'] =5;
    $params['body']['query']['function_score']['query']['bool']['must'][] = 
            array('match' => array(
                'title' => "中国",
               )
        );
    $result  = $client->search($params); 

以上是通过php代码来实现数据的查询。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值