在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)