Thinkphp使用Elasticsearch查询

在Thinkphp中调用ES,如果自己手写json格式的query肯定是很麻烦的。我这里使用的是ONGR ElasticsearchDSL 构建 ES 查询。ongr ElasticsearchDSL 的开源项目地址:GitHub - ongr-io/ElasticsearchDSL: Query DSL library for Elasticsearch。ONGR ElasticsearchDSL 提供了一种更灵活、更易于维护的 Elasticsearch 查询构建方式,将复杂的 API 操作抽象为简洁的 DSL 语法。本文将深入探讨如何利用 ONGR ElasticsearchDSL 库构建 ES 查询,并实现高效、灵活的数据检索。

安装 ONGR ElasticsearchDSL 库:

安装前要先确认自己的ES版本,一定要选择ES对应的ElasticsearchDSL 库,对应版本列表如下:

我们使用composer安装,在自己的thinkphp项目目录下修改composer.json添加对应的ElasticsearchDSL 库版本,然后执行composer命令安装:

composer require ongr/elasticsearch-dsl

安装完成后就是在thinkphp项目中使用ElasticsearchDSL 了,示例代码:

 //根据需要引入对应的包
//引入bool查询
use ONGR\ElasticsearchDSL\Query\Compound\BoolQuery;
//引入match查询
use ONGR\ElasticsearchDSL\Query\FullText\MatchQuery;
//引入matchphrase查询
use ONGR\ElasticsearchDSL\Query\FullText\MatchPhraseQuery;
//引入term条件查询
use ONGR\ElasticsearchDSL\Query\TermLevel\TermQuery;
//引入多个term条件查询
use ONGR\ElasticsearchDSL\Query\TermLevel\TermsQuery;
//引入range查询
use ONGR\ElasticsearchDSL\Query\TermLevel\RangeQuery;
//引入wildcard查询
use ONGR\ElasticsearchDSL\Query\TermLevel\WildcardQuery;
//引入Search构建搜索
use ONGR\ElasticsearchDSL\Search;
//引入排序字段
use ONGR\ElasticsearchDSL\Sort\FieldSort;

//首先创建一个ES搜索实例
$hosts = [[
	'host' => '127.0.0.1', // 必填项
	'port' => 9200, // 不设置,默认9200,
	'scheme' => 'http', // 不设置, 默认http
	'user' => 'elastic',
	'pass' => '123456'
]];
$esClient = ClientBuilder::create()->setHosts($hosts)->build();
//构建一个bool查询
$boolQuery = new BoolQuery();
//构建一个MatchPhrase查询,比如搜索title字段含“大模型”的条件
$matchPhraseQuery = new MatchPhraseQuery('title',"大模型",['analyzer'=>'ik_smart']);//这里使用了ik_smart分词器
//将这个条件加入到搜索中
$boolQuery->add($matchPhraseQuery, 'must');
$search->addQuery($boolQuery); 
//如果要加filter限制条件 可以使用addPostFilter
//比如加上时间范围限制,创建一个RangeQuery
$lasttime = time()-86400;//24小时前
$filterQuery = new BoolQuery();
$rangeQuery = new RangeQuery('addtime',['gte' => $lasttime]);
$filterQuery->add($rangeQuery, 'must');
//对应search修改为:
$search->addQuery($boolQuery)->addPostFilter($filterQuery); 
//添加排序条件
$sortFields = ['date','_score'];//按时间和评分排序
for($sortFields as $sortField){
    $fieldSort = new FieldSort($sortField, null, ['order' => FieldSort::DESC])
    $search->addSort($fieldSort);
}
//设置分页条件
$search->setFrom(($current_page-1)*$pagesize);
$search->setSize($pagesize);
//构建查询query
$query = [
	'index' => $indx_name, //对应的ES索引名称
	'body' => $search->toArray(),
];
//执行查询
$response = $esClient->search($query);
//返回结果集
if ($response['timed_out'] == false) {
	//转换结果集合
	$collection = new Collection(array_column($response['hits']['hits'],'_source'));
	$total = $response['hits']['total']['value'];
}

上面代码主要使用 BoolQuery 构建了多条件查询,使用 ONGR ElasticsearchDSL 库构建 ES 查询 更易于阅读和修改,提高代码可维护性。

文章地址 :Thinkphp使用ElasticsearchES查询 – AI小站 (aisites.cn)

相关推荐

  1. elasticsearch查询

    2024-06-08 12:20:04       32 阅读
  2. Go查询Elasticsearch

    2024-06-08 12:20:04       39 阅读
  3. Elasticsearch一些函数查询

    2024-06-08 12:20:04       32 阅读
  4. Elasticsearch 查询语法

    2024-06-08 12:20:04       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 12:20:04       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 12:20:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 12:20:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 12:20:04       18 阅读

热门阅读

  1. Elasticsearch 认证模拟题 - 10

    2024-06-08 12:20:04       10 阅读
  2. TCP和udp能使用同一个端口通讯吗

    2024-06-08 12:20:04       8 阅读
  3. 设计模式总结

    2024-06-08 12:20:04       6 阅读
  4. UVa1116/LA2429 Puzzle

    2024-06-08 12:20:04       5 阅读
  5. #07 使用Stable Diffusion生成高质量图片的技巧

    2024-06-08 12:20:04       8 阅读
  6. HTTP参数污染漏洞

    2024-06-08 12:20:04       8 阅读
  7. 速盾:图片cdn托管

    2024-06-08 12:20:04       9 阅读
  8. 挣值计算中的典型与非典型

    2024-06-08 12:20:04       8 阅读
  9. Objective-C中分类无法添加实例变量的底层原理

    2024-06-08 12:20:04       10 阅读
  10. android原生TabLayout之自定义指示器效果

    2024-06-08 12:20:04       10 阅读