当前位置: 首页 > news >正文

php连接sphinx的长连接事宜以及sphinx的排除查询以及关于sphinx里使用SetSelect进行复杂的条件过滤或复杂查询

一、php连接sphinx的长连接事宜以及sphinx的排除查询

    在使用php连接sphinx时,默认的sphinx连接非长连接,于是在想php连接sphinx能否进行一些优化 publish:January 9, 2018 -Tuesday:

    方法:public bool SphinxClient::open ( void ) — 建立到搜索服务端的持久连接。此函数没有参数。成功时返回 TRUE,或者在失败时返回FALSE。在网上了解到php调用sphinx api进行长连接时,并不是我们想象中的那样会在php-fpm的fastcgi状态下一直与sphinx的searchd进程保持长连接,sphinx的api接口中open()方法仅仅提供了在一次会话请求中保证多个sphinx调用在单个php进程中是共用一个sphinx tcp连接通道,当php解释运行完,与sphinx的连接也会自动断开,而不是保持连接状态。看到这里我觉得我的业务中使用这项那就没有什么意义了,因为我的业务中基本都是连接sphinx执行一次查询然后结束。不过我在线上业务时谨慎地在一台服务器上尝试查看这种情况.

    在一台WEB上打开长连接,同时观察着sphinx的连接数据(我这里中间有haproxy作为中转),如果这个长连接能实现php与searchd的长连接,那么改了一台服务器后,因为线上一直有请求,则我的WEB上所有的PHP-FPM进程就应该都能保持一个与sphinx的连接(单台WEB上是60个php进程,理论上应该proxy上的sphinx请求能增加到60左右),而如果真是在php请求结束后就断开sphinx,则不会对proxy上的数据有任何影响。使用之后发现这个数据确实没有什么变化。如下图即是我依据的数据:

    而如果sphinx的长连接真的只有这个意义的话,那我感觉它没有什么意义,因为在一个php请求中,除非我们自己去关闭,否则它不会关闭(当然超时除外,但这种情况正常情况基本不会出现)。查看spinx的api看的open方法,发现其就是判断当前是否connect,如果连接了就返回false,如果没有就执行一次连接。而实际在执行query查询的时候它本身也会去调用_Connect判断并重新连接了sphinx,即表示即使在php进程执行中sphinx连接超时中断,但随后你再进行query查询,依然会自动连接sphinx.不需要保存这个长连接。sphinx的api里的open方法如下:

#sphinx的api中的open方法
function Open()
{if ( $this->_socket !== false ){$this->_error = 'already connected';return false;}if ( !$fp = $this->_Connect() )return false;// command, command version = 0, body length = 4, body = 1$req = pack ( "nnNN", SEARCHD_COMMAND_PERSIST, 0, 4, 1 );if ( !$this->_Send ( $fp, $req, 12 ) )return false;$this->_socket = $fp;return true;
}#open方法里调用的_Send方法
function _Send ( $handle, $data, $length )
{if ( feof($handle) || fwrite ( $handle, $data, $length ) !== $length ){$this->_error = 'connection unexpectedly closed (timed out?)';$this->_connerror = true;return false;}return true;
}

    如果不能保持php-fpm进程与sphinx的长连接,依然是每次客户端向php发送请求(即使是同一个php-fpm进程处理),仍需要执行sphinx连接的话,确实未发现这个open方法有什么意义。

    在使用sphinx时,大多数情况下是进行过滤,但有时有特殊需要进行一些排它查询,比如不需要某个ID的值出来。比如:在查询某篇文章相关联的文章时,不要把这篇文章本身查询出来。如果你的article_id字段在sphinx配置文件建的是字段xmlpipe_field_string,则可以使用:

$query.="!@article_id ".$id;    #注意@号之前的感叹号
$Sphinx->query($query)

 如果你的article_id字段在sphinx配置文件建的是属性xmlpipe_attr_uint,则可以使用:

$Sphinx->SetFilter('article_id', array($id), true);  #注意最后一个参数,其就是排除的意义

 二、关于sphinx里使用SetSelect进行复杂的条件过滤或复杂查询

    sphinx提供了filter过滤以及通过关键词进行query查询,但简单的query一个关键词并不能满足我们的查询要求,filter并不能支持复杂的逻辑组合运算,过滤条件都只是多重的叠加,即AND操作,并不支持。比如我们有很多文章内容及其它属性已经建好索引,如果要在一次查询中实现查询今天发表的新闻和昨天发表的非新闻文章中带有关键词新闻的内容查询出来。如果使用filter的话就没法处理了,因为filter即不能用于过滤文章类别,也不能用于过滤发表时间。

    可见sphinx的filter不能用于单条件多重过滤,如上即时间不能过滤今天同时又过滤昨天,类别不能用于过滤新闻又同时过滤非新闻。这个时间我们就要考虑使用sphinx的复杂查询了。

    写过SQL的话我们一定对复杂查询不陌生,sphinx的复杂查询的实现方式有点类似于自定义的SQL查询。从而筛选出我们需要的数据。写sphinx的复杂查询就相当于写mysql的where条件。

    SetSelect这个api,可以实现sphinx进行自定义复杂查询条件 publish:January 12, 2018 -Friday。

#(PECL sphinx >= 1.0.1)
#SphinxClient::setSelect — Set select clause
public bool SphinxClient::setSelect ( string $clause )
#Sets the select clause, listing specific attributes to fetch, and expressions to compute and fetch. 

 我目前使用过的sphinx里SetSelect的几个复杂SQL写法如下,当然肯定不只这些。

1:计算数据值

        有时内容的权重并不是依靠某个字段,而是依靠一个计算值,比如把文章按总热度排序,假设我们的条件是把文章的评论数以阅读数的1%相加来得出,这时我们就可以使用下面的方法来计算:

#根据多个字段计算数值as成某个字段(像sql)一样,然后在后面再利用这个字段,比如SetSortMode使用weighta排序
$cl->SetSelect ( "*, (views * 0.01 + comments) AS weighta" );

2:简单if判断

        比如要查询今天发表的新闻和昨天之后发表的非新闻文章。

#先设置生成myfilter字段,再用filter过滤这个字段为真即可
$cl->SetSelect ( "*, ( if( ((public_time>=16843434 , 1,0) AND type=1 ) AND ((public_time>=16813434 , 1,0) AND type>1 ) ) AS myfilter" );

3:IN查询

        比如要查询PHP和sphinx以及linux等类栏目中里今天发表的文章。

#如下1,2,3,4分别是各类的ID,使用逗号分开直接写在过滤字段后面,
$cl->SetSelect ( "*, IF( IN(type, 1,2,3,4) AND public_time>=16843434, 1, 0) AS myfilter" );

 其它:

        另外查询中还可以使用@调用sphinx的数据,比如 @weight可以调用sphinx系统中的权重值,可拿来进行进一步的计算。Starting with version 0.9.9-rc2, 复杂查询中可以支持aggregate functions (AVG(), MIN(), MAX(), SUM()) are supported when using GROUP BY.

相关文章:

php连接sphinx的长连接事宜以及sphinx的排除查询以及关于sphinx里使用SetSelect进行复杂的条件过滤或复杂查询

一、php连接sphinx的长连接事宜以及sphinx的排除查询 在使用php连接sphinx时,默认的sphinx连接非长连接,于是在想php连接sphinx能否进行一些优化 publish:January 9, 2018 -Tuesday: 方法:public bool SphinxClient::open ( void ) — 建立到…...

抓包分析排查利器TCPdump

tcpdump命令介绍与常规用法。 基础命令介绍 # 固定语法 -i 指定网卡名称 -nn 显示IP地址 -w 指定输出的文件名称 tcpdump -i eth0 -nn -w test.cap-nn 不把主机的网络地址与协议转换成名字 -w 把数据包数据写入指定的文件 and 连接参数 host 指明主机 port 指明端口 src 源IP…...

八种排序算法的复杂度(C语言)

归并排序(递归与非递归实现,C语言)-CSDN博客 快速排序(三种方法,非递归快排,C语言)-CSDN博客 堆排序(C语言)-CSDN博客 选择排序(C语言)以及选择排序优化-CSDN博客 冒泡排序(C语言)-CSDN博客 直接插入排序(C语言)-CSDN博客 希尔排序( 缩小增量排序 )(C语言)-CSDN博客 计数…...

docker compose部署rabbitmq集群,并使用haproxy负载均衡

一、创建rabbitmq的data目录 mkdir data mkdir data/rabbit1 mkdir data/rabbit2 mkdir data/rabbit3 二、创建.erlang.cookie文件(集群cookie用) echo "secretcookie" > .erlang.cookie 三、创建haproxy.cfg配置文件 global log stdout fo…...

git强制推送代码教程

git强制推送代码教程 首先说明情况,我的代码remote了两个git库,现在想要推送到其中一个,但是版本不对,被拒绝,因此下面将进行强制推送 首先检查远程库都有哪些 git remote -v2. 检查当前的分支 git branch当前分支前…...

windows C++-高级并发和异步(三)

深入了解 winrt::resume_foreground(下) 调用 winrt::resume_foreground 时会始终先排队,然后展开堆栈。 也可选择设置恢复优先级。 winrt::fire_and_forget RunAsync(DispatcherQueue queue) {...co_await winrt::resume_foreground(queue, DispatcherQueuePrior…...

河北移动:核心系统数据库成功完成整体迁移 ,实现全栈国产|OceanBase案例

本文作者:移动通信集团河北有限公司架构规划专家,房瑞 项目背景: 中国移动通信集团河北有限公司一直在积极响应国家及集团的号召,以磐舟&磐基云原生为底座,结合国产浏览器、中间件、数据库、操作系统和服务器等&a…...

ZKRollup

目录 ZKRollup 基本概念 运作原理 特点与优势 应用场景 典型项目 ZKRollup ZKRollup,全称为Zero-Knowledge Rollup,是一种基于零知识证明的二层扩容方案(Layer 2)。它旨在通过提高交易处理效率和降低交易成本来扩展区块链网络的能力,尤其是在以太坊等区块链平台上得…...

letcode 分类练习 树的遍历

letcode 分类练习 树的遍历 树的构建递归遍历前序遍历中序遍历后序遍历 迭代遍历前序遍历中序遍历后序遍历 层序遍历层序遍历可以解决的问题107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的…...

redisssion分布式锁

分布式锁的问题 基于setnx的分布式锁实现起来并不复杂,不过却存在一些问题。 锁误删问题 第一个问题就是锁误删问题,目前释放锁的操作是基于DEL,但是在极端情况下会出现问题。 例如,有线程1获取锁成功,并且执行完任…...

嘎嘎嘎拿到去年想要的包

一年多了 继续,把项目收尾吧 好好学前端,外企!react!从0开始,紧迫!加油!...

前奏编曲:如何编写二段式前奏

选好音源 Pianoteq 6 STAGE比较明亮些,适合做前奏的音源 确定和弦进行 比如4536251,每个小节2和弦,每个小节的和弦弹一下 优化和弦进行衔接和织体 二段式不用对和弦进行就近解决的处理,因为前奏前后要形成对比。 前半部分往…...

征服云端:Kubernetes如何让微服务与云原生技术如虎添翼

引言 在这个数字化转型的时代,微服务架构已经成为构建现代应用程序的首选方式。它不仅提高了开发效率,还增强了系统的可扩展性和灵活性。而随着云计算技术的迅猛发展,云原生的概念逐渐深入人心,它代表了一种全新的软件开发方法论…...

开源AI智能名片系统与高级机器学习技术的融合应用:重塑商务交流的未来

摘要:在数字化浪潮的推动下,人工智能(AI)技术,尤其是机器学习领域的快速发展,正深刻改变着各行各业的面貌。开源AI智能名片系统作为这一变革的先锋,通过集成并优化多种高级机器学习技术&#xf…...

Java中synchronized的偏向锁是如何减少锁开销的

偏向锁(Biased Locking)是一种优化 Java synchronized 锁的机制,旨在减少在无竞争情况下的锁开销。它通过将锁偏向于单个线程来优化锁的性能。以下是偏向锁减少锁开销的具体方式和原理: 偏向锁的工作原理 锁的初始状态: 当一个对…...

react18 + ts 使用video.js 直播.m3u8格式的视频流

一、安装依赖 我使用的video.js版本是8.17.3,从 Video.js 7.x 开始,HLS 支持被内置到了 Video.js 中所以不需要安装其他依赖 npm i video.js 二、创建VideoPlayer组件 import React, { useEffect, useRef } from react import videojs from video.js …...

使用 onBeforeRouteLeave 组合式函数提升应用的用户体验

title: 使用 onBeforeRouteLeave 组合式函数提升应用的用户体验 date: 2024/8/14 updated: 2024/8/14 author: cmdragon excerpt: 摘要:本文介绍了在Nuxtjs中使用onBeforeRouteLeave组合式函数来提升应用用户体验的方法。onBeforeRouteLeave允许在组件离开当前路…...

uni-app 吸顶方案总结

效果 页面级 uni.pageScrollTo 官方文档&#xff1a;https://uniapp.dcloud.net.cn/api/ui/scroll.html#pagescrollto 原生头部导航 uni.pageScrollTo({selector: #tabs,duration: 300 });(推荐)需要兼容自定义头部导航 <template><view id"demo1" :styl…...

【C#】知识汇总

目录 1 概述1.1 GC&#xff08;Garbage Collection&#xff09;1.1.1 为什么需要GC&#xff1f;1.1.2 GC的工作原理工作原理什么是Root&#xff1f;GC算法&#xff1a;Mark-Compact 标记压缩算法GC优化&#xff1a;Generational 分代算法 1.1.3 GC的触发时间1.1.4 如何减少垃圾…...

1、Unity【基础】3D数学

3D数学 文章目录 3D数学1、数学计算公共类Mathf1、Mathf和Math2、区别3、Mathf中的常用方法&#xff08;一般计算一次&#xff09;4、Mathf中的常用方法&#xff08;一般不停计算&#xff09;练习 A物体跟随B物体移动 2、三角函数1、角度和弧度2、三角函数3、反三角函数练习 物…...

虚拟机ubuntu22的扩容记录

这里lsblk命令能看到&#xff0c; ubuntu逻辑分区只有29G&#xff0c; 但总分区60G&#xff0c;还有接近30G未使用。 rootx:/home/x# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 63.9M 1 loop /snap/core2…...

Docker 常用配置

Docker 常用配置 1. 配置方法 修改下面位置&#xff1a; Linux&#xff1a;vim /etc/docker/daemon.jsonmacOS&#xff1a;菜单栏图标->Settings->Docker Engine 注意&#xff1a;修改完需要重启Docker Linux&#xff1a;systemctl restart dockermacOS&#xff1a;…...

通过示例了解 .NET Core 中的依赖注入

依赖注入 (DI) 是一种用于实现 IoC&#xff08;控制反转&#xff09;的设计模式&#xff0c;可以更好地解耦应用程序内的依赖关系并更轻松地管理它们。.NET Core 内置了对依赖注入的支持&#xff0c;提供了一种有效管理依赖关系的强大方法。 一.什么是依赖注入&#xff1f; 依…...

fetch、FormData上传多张图片

利用fetch方法和FormData对象上传多张图片 formdata()对象可以序列化多张图片 <html><head><meta http-equiv"content-type" content"text/html;charsetUTF-8"/><title>测试fetch和formdata上传多张图片</title></head&…...

C++STL详解(五)——list类的具体实现

一.本次所需实现的三个类及其成员函数接口 链表首先要有结点&#xff0c;因此我们需要实现一个结点类。 链表要有管理结点的结构&#xff0c;因此我们要有list类来管理结点。 链表中还要有迭代器&#xff0c;而迭代器的底层其实是指针。但是我们现有的结点类无法完成迭代器的…...

鸿蒙(API 12 Beta3版)【使用投播组件】案例应用

华为视频接入播控中心和投播能力概述** 华为视频在进入影片详情页播放时&#xff0c;支持在控制中心查看当前播放的视频信息&#xff0c;并进行快进、快退、拖动进度、播放暂停、下一集、调节音量等操作&#xff0c;方便用户通过控制中心来操作当前播放的视频。 当用户希望通…...

【STM32项目】在FreeRtos背景下的实战项目的实现过程(一)

个人主页~ 这篇文章是我亲身经历的&#xff0c;在做完一个项目之后总结的经验&#xff0c;虽然我没有将整个项目给放出来&#xff0c;因为这项目确实也是花了米让导师指导的&#xff0c;但是这个过程对于STM32的实战项目开发都是非常好用的&#xff0c;可以说按照这个过程&…...

C#垃圾处理机制相关笔记

C#编程中的垃圾处理机制主要通过垃圾回收器&#xff08;Garbage Collector&#xff0c;GC&#xff09;实现自动内存管理。C#作为一种托管语言&#xff0c;其垃圾处理机制显著减轻了程序员的内存管理负担&#xff0c;与C语言等非托管语言形成鲜明对比。具体介绍如下&#xff1a;…...

C语言memcmp函数

目录 开头1.什么是memcmp函数?2.memcmp函数的内部程序流程图 3.memcmp函数的实际应用比较整型数组比较短整型二维数组比较结构体变量…… 结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们要学一下关于C语言里的memcmp函数的一些知识。 1.什么是memcmp函数?…...

低代码: 组件库测试之Vue环境下的测试工具以及测试环境搭建

Vue Test Utils Vue Test Utils 1 targets Vue 2. Vue Test Utils 2 targets Vue 3. 特别注意要使用 版本 2.0.0 以上 提供特定的方法,在隔离的话环境下,进行组件的挂载,以及一系列的测试 配置开发环境 手动配置, 是比较麻烦的vue cli 是基于插件架构的, 插件可以: 安装对…...

wordpress制作网站步骤/公司网站免费建站

目录 1.机器学习的概念 2.机器学习研究的主要内容 3.基本术语 4.概念学习与假设空间 1.机器学习的概念 广义上讲&#xff1a;机器学习&#xff08;Mechine Learning&#xff09;是计算机程序随着经验积累自动提升性能或系统自我改进的过程。 形式化定义&#xff1a;对于某类…...

为什么教育网站做的都很烂/软文网站有哪些

2019独角兽企业重金招聘Python工程师标准>>> 陶炳哲 — APRIL 09, 2015 ##为何响应时间常被测错 响应时间在许多情况下都是性能分析的基础。它们处于预期的界限内时&#xff0c;一切正常&#xff1b;而一旦过高&#xff0c;我们就得开始优化应用。 因此响应时间在性…...

有网站代码怎么建站/中国做网站的公司排名

在百度2019AI开发者大会上有很多相对精彩的公开课&#xff0c;DuerOS相关的公开课有4场&#xff0c;分别是&#xff1a;DuerOS技能开发与CFC编程如何在DuerOS技能中实现用户支付购买面向多方式交互模型的DPL应用故事引擎在DuerOS技能开发中的应用DPL来了&#xff0c; DPL给我们…...

厦门做网站多少/百度官方人工客服电话

一&#xff0c;利用DirectX诊断工具查看硬件配置DirectX诊断工具可以帮助我们对硬件工作情况作出测试、诊断并进行修改&#xff0c;当然我们也可以利用它来查看机器的硬件配置。运行“系统信息”窗口&#xff0c;找到 “工具--DirectX诊断工具”(或者进入安装盘符中Windows目录…...

苏州新区城乡建设网站/电商培训课程

在打算写这篇文章之前&#xff0c;我是一个分号党&#xff0c;在写这篇文章之后&#xff0c;可能会转为无分号党了。之前是写分号是编辑器语法较检所养成的强迫症&#xff0c;现在观念的转变&#xff0c;是因为看了不少大神的讨论后&#xff0c;觉得javascript语句后写分号除了…...

老实人做网站/简单网页设计模板html

传送门 **dfs思路&#xff1a;**根据题目的描述&#xff0c;镜像对称&#xff0c;就是左右两边相等&#xff0c;也就是左子树和右子树是相等的。因此采用两个指针p&#xff0c;q分别指向左右两颗子树&#xff0c;在每次递归时候就判断一下当前节点是否相等&#xff0c;不相等则…...