Elasticsearch-PHP 搜索操作
搜索操作
好吧,这不叫elasticsearch的不劳而获!让我们来谈谈PHP客户端中的搜索操作。
客户端允许你通过REST API访问所有的查询和公开的参数,尽可能的遵循命名规则。让我们来看一些例子,你就可以熟悉它的语法。
匹配查询
这里是一个标准的匹配查询的curl:
- curl -XGET 'localhost:9200/my_index/my_type/_search' -d '{
- "query" : {
- "match" : {
- "testField" : "abc"
- }
- }
- }'
这里是在客户端中=同样查询结构的查询:
- $params['index'] = 'my_index';
- $params['type'] = 'my_type';
- $params['body']['query']['match']['testField'] = 'abc';
- $results = $client->search($params);
使用原始JSON
正如你看到的JSON和查询之间的转换是非常简单的。你可以直接序列化JSON到body中,或者甚至提供原始的JSON字符串。客户端会处理的很好:
- $json = '{
- "query" : {
- "match" : {
- "testField" : "abc"
- }
- }
- }';
- $params['index'] = 'my_index';
- $params['type'] = 'my_type';
- $params['body'] = $json;
- $results = $client->search($params);
搜索结果返回的是简单的由elasticsearch响应元素序列化成的数组。与搜索结果工作就像与迭代数组一样简单:
- $milliseconds = $results['took'];
- $maxScore = $results['hits']['max_score'];
- $score = $results['hits']['hits'][0]['_score'];
- $doc = $results['hits']['hits'][0]['_source'];
Bool 查询
Bool查询可以使用客户端轻松的构造出来。例如这个查询:
- curl -XGET 'localhost:9200/my_index/my_type/_search' -d '{
- "query" : {
- "bool" : {
- "must": {
- "match" : {
- "testField" : "abc"
- },
- "match" : {
- "anotherTestField" : "xyz"
- }
- }
- }
- }
- }'
像这样的结构(注意中括号的位置)
- $params['index'] = 'my_index';
- $params['type'] = 'my_type';
- $params['body']['query']['bool']['must'] = array(
- array('match' => array('testField' => 'abc')),
- array('match' => array('anotherTestField' => 'xyz')),
- );
- $results = $client->search($params);
一个更复杂的例子
让我们来构造一个稍微复杂的例子:一个过滤的查询包含一个过滤器和一个查询。这在elasticsearch查询中是非常常见的活动,所以,这将是一个好的演示。
curl版本的查询:
- curl -XGET 'localhost:9200/my_index/my_type/_search' -d '{
- "query" : {
- "filtered" : {
- "filter" : {
- "term" : {
- "my_field" : "abc"
- }
- },
- "query" : {
- "match" : {
- "my_other_field" : "xyz"
- }
- }
- }
- }
- }'
PHP版本的查询:
- $params['index'] = 'my_index';
- $params['type'] = 'my_type';
- $filter = array();
- $filter['term']['my_field'] = 'abc';
- $query = array();
- $query['match']['my_other_field'] = 'xyz';
- $params['body']['query']['filtered'] = array(
- "filter" => $filter,
- "query" => $query
- );
- $results = $client->search($params);
为了清晰和可读性,过滤器和查询部分作为变量被单独分配并且之后组合在一起。这通常对应用程序来说是一个好的设计模式,因为它可以让你对待你的查询和过滤器想构建块一样,可以通过你的应用程序传递。
当然,在最后,他被构建在一个简单的数组中。你可以轻松构建整个数组在一个定义的嵌套数组块中,或者一行一行的构建。
所有客户端需要一个关联数组,并且结构要和JSON查询结构匹配。
Function_Score 查询
有一点需要特别注意关于function_score 查询。由于PHP处理JSON编码,一切都被转换成了数组的这种活那种形式。这通常不是问题,因为Elasticsearch API中大多地方接受数组或互换空对象。
然而,function_score 稍有不同,需要区分空数组和空对象,例如,考虑如下查询:
- {
- "query":{
- "function_score":{
- "functions":[
- {
- "random_score":{}
- }
- ],
- "boost_mode":"replace",
- "query":{
- "match_all":{}
- }
- }
- }
- }
function_score定义一个数组对象,random_score 用空对象作为值。
PHP的json_encode会转换查询到这种形式:
- {
- "query":{
- "function_score":{
- "functions":[
- {
- "random_score":[]
- }
- ],
- "boost_mode":"replace",
- "query":{
- "match_all":[]
- }
- }
- }
- }
这样会导致一个解析异常。我们需要做的是告诉PHP random_score 包含一个空对象,不是一个数组。要做到这样,我们需要需要指定一个显式空对象:
- $params['body'] = array(
- 'query' => array(
- 'function_score' => array(
- 'functions' => array(
- array("random_score" => (object) array())
- ),
- 'query' => array('match_all' => array())
- )
- )
- );
- $results = $client->search($params);
现在,JSON会被正常编码,不再会出现解析异常。
扫描/滚动
Elasticsearch的扫描/滚动功能类似于搜索,但在许多方面不同。它的工作方式是使用scan中的search_type执行一个搜索查询。这将启动一个扫描窗口并在扫面时保持打开。这允许真正的一致的分页。
一旦扫描窗口打开,你可能开始在窗口上滚动。这返回的结果要匹配你的查询,但顺序是随机的。这种随机的排序对性能来说是很重要的。深分页时昂贵的,当你需要通过碎片去维护一个分类的一致的排序。
- $client = new Elasticsearch\Client();
- $params = array(
- "search_type" => "scan", // use search_type=scan
- "scroll" => "30s", // how long between scroll requests. should be small!
- "size" => 50, // how many results *per shard* you want back
- "index" => "my_index",
- "body" => array(
- "query" => array(
- "match_all" => array()
- )
- )
- );
- $docs = $client->search($params); // Execute the search
- $scroll_id = $docs['_scroll_id']; // The response will contain no results, just a _scroll_id
- // Now we loop until the scroll "cursors" are exhausted
- while (\true) {
- // Execute a Scroll request
- $response = $client->scroll(
- array(
- "scroll_id" => $scroll_id, //...using our previously obtained _scroll_id
- "scroll" => "30s" // and the same timeout window
- )
- );
- // Check to see if we got any search hits from the scroll
- if (count($response['hits']['hits']) > 0) {
- // If yes, Do Work Here
- // Get new scroll_id
- // Must always refresh your _scroll_id! It can change sometimes
- $scroll_id = $response['_scroll_id'];
- } else {
- // No results, scroll cursor is empty. You've exported all the data
- break;
- }
- }
Elasticsearch-PHP 搜索操作的更多相关文章
- Elasticsearch 教程--搜索
搜索 – 基本工具 到目前为止,我们已经学习了Elasticsearch的分布式NOSQL文档存储,我们可以直接把JSON文档扔到Elasticsearch中,然后直接通过ID来进行调取.但是Elas ...
- Elasticsearch 数据搜索篇·【入门级干货】
ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API.本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用.虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的 ...
- Elasticsearch分布式搜索集群配置
配置文件位于%ES_HOME%/config/elasticsearch.yml文件中,用Editplus打开它,你便可以进行配置. 所有的配置都可以使用环境变量,例如:node.rack: ${ ...
- ElasticSearch+Kibana 索引操作
ElasticSearch+Kibana 索引操作 一 前言 ElasticiSearch 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引 ...
- Elasticsearch 数据搜索篇·【入门级干货】===转
ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API.本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用.虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的 ...
- elasticsearch的索引操作和文档操作总结
参考文档:https://es.xiaoleilu.com/010_Intro/00_README.html 一.索引操作 1.查看当前节点的所有的index 查看当前节点的所有的index [roo ...
- 使用Logstash同步数据至Elasticsearch,Spring Boot中集成Elasticsearch实现搜索
安装logstash.同步数据至ElasticSearch 为什么使用logstash来同步,CSDN上有一篇文章简要的分析了以下几种同步工具的优缺点:https://blog.csdn.net/la ...
- 十九种Elasticsearch字符串搜索方式终极介绍
前言 刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪 ...
- Elasticsearch实现搜索推荐词
本篇介绍的是基于Elasticsearch实现搜索推荐词,其中需要用到Elasticsearch的pinyin插件以及ik分词插件,代码的实现这里提供了java跟C#的版本方便大家参考. 1.实现的结 ...
随机推荐
- NET Core 2.2
.NET Core 2.2 新增部分功能使用尝鲜 https://www.cnblogs.com/viter/p/10070248.html 前言 美国当地时间12月4日,微软2019开发者大 ...
- WCF常用绑定选择
一.五种常用绑定常用绑定的传输协议以及编码格式 名称 传输协议 编码格式 互操作性 BasicHttpBinding HTTP/HTTPS Text,MTOM Yes NetTcpBinding TC ...
- 【Netty】netty学习之nio了解
[一]五种IO模型: (1)阻塞IO(2)非阻塞IO(任务提交,工作线程处理,委托线程等待工作线程处理结果的同时,也可以做其他的事情)(3)IO复用模型.(委托线程接收多个任务,将任务提交给工作线程. ...
- LG1402 酒店之王
题意 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. 有 ...
- BW处理链(Process Chain)
处理链是能自动完成数据的处理和加载等操作的自动化工具. 1.创建处理链 输入T-code:RSPC打开操作界面,或者处理链已经在T-code:RSA1=>Modeling界面下,也可以直接单 ...
- pthread中读写锁
读写锁很像一个互斥量,他阻止多个线程同时修改共享数据的另一种方法,区分不同互斥量的是他是分读数据和写数据,一个读写锁允许同时多个线程读数据,只要他们不修改数据. 只要没有写模式下的加锁,任意线程都可以 ...
- ecmall在linux下的安装注意事项(转)
今天跟ecshop客服胡娇沟通后知道ecmall基本配置是[LAMP] linux+apache+mysql+php,然后自己开始在linux下安装ecmall并做迁移,整理了一下中间碰到的问题.1. ...
- vue的路由初识01
今天就做了一个vue-router的实例,(路由跳转,参数的传递[一个参数,多个参数])<!DOCTYPE html> <html> <head> <meta ...
- 安装QConfig备忘
下载wget https://github.com/Qihoo360/QConf/archive/1.2.1.tar.gz 解压tar -zxf 1.2.1.tar.gz进入目录cd QConf-1. ...
- C++使用回溯法实现N皇后问题的求解
回溯法是个很无聊的死算方法,没什么技巧,写这篇博客主要原因是以前思路不太清晰,现在突然想用回溯法解决一个问题时,无法快速把思路转换成代码. ------------------------------ ...