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

PHP 拆词搜索(常用于搜索内容)

$mkey = $_GET["mkey"];
if ($mkey) {
    $tj_mkey = 'and (xtitle like "%' . $mkey . '%" or danhao like "%' . $mkey . '%" or addr like "%' . $mkey . '%")';
    //分词搜索
    include_once dirname(__FILE__, 3) .'/DetachStr.class.php';
    $Detach = new DetachStr;
    $mkeyArr = $Detach->dualDecom($mkey);
    if ($mkeyArr) {
        $tj_param = ",(";
        foreach ($mkeyArr as $key => $val) {
            if ($key > 0) {
                $tj_param .= "+";
            }
            $tj_param .= "IF(CONCAT_WS(' ', xtitle, danhao, addr) LIKE '%{$val}%', 1, 0)";
        }
        $tj_param .= ") AS keyNum";
        $tj_mkey = "and (xtitle REGEXP '" . implode("|", $mkeyArr) . "' or danhao REGEXP '" . implode("|", $mkeyArr) . "' or addr REGEXP '" . implode("|", $mkeyArr) . "')";
        $tj_sort = "keyNum DESC,";
    }
}

//SQL语句修改
$sql = "select *{$tj_param} from php_jigui where jia=1 $tj_mkey";
$sql .= " order by {$tj_sort}id desc limit $start,$count";

执行结果
 
DetachStr.class.php文件内容

<?php

/**
 * 文本分词类
 * @version 1.0.1
 */
class DetachStr
{
	/**
	 * 分词处理
	 * @param string $text 输入文本
	 * @return array 分词结果数组
	 */
	public function dualDecom($text)
	{
		$result = array();

		// 先处理英文单词、数字和表情符号
		$pattern = '/([a-zA-Z]+)|([0-9]+)|([\x{1F600}-\x{1F64F}\x{1F300}-\x{1F5FF}\x{1F680}-\x{1F6FF}\x{2600}-\x{26FF}])/u';
		preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE);

		// 保存特殊元素及其位置
		foreach ($matches[0] as $match) {
			$result[] = $match[0];
		}

		// 非中文字符替换为空格
		$text = preg_replace('/[^\x{4e00}-\x{9fa5}]+/u', ' ', $text);

		// 去除连续的空格
		$text = preg_replace('/\s+/', ' ', $text);

		// 按照空格分割文本
		$words = explode(' ', trim($text));
		foreach ($words as $word) {
			$length = mb_strlen($word, 'UTF-8');

			// 只有一个或两个字的词语直接添加
			if ($length == 1 || $length == 2) {
				$result[] = $word;
				continue;
			}

			// 生成2-5个字的中文词语
			for ($i = 0; $i < $length; $i++) {
				for ($j = 2; $j <= 5; $j++) {
					if ($i + $j <= $length) {
						$result[] = mb_substr($word, $i, $j, 'UTF-8');
					}
				}
			}
		}

		// 返回
		return array_unique($result);
	}
}

http://www.dtcms.com/a/130995.html

相关文章:

  • 从三次方程到复平面:复数概念的奇妙演进(一)
  • 多光谱相机:海洋管道漏油(溢油)监测
  • 2025蓝桥杯C++ A组省赛 题解
  • 用Python构建区块链身份认证:安全与信任的新篇章
  • ZYNQ笔记(七):程序固化(QSPI Flash)
  • OpenSSH版本的重大升级 :OpenSSH 10
  • 推流265视频,网页如何支持显示265的webrtc
  • [特殊字符] Hyperlane:为现代Web服务打造的高性能Rust文件上传解决方案
  • 天梯赛L2题目算法汇总(记录高频考点)
  • 智能指针之设计模式2
  • 笔试专题(八)
  • Python 的 collections 模块
  • 【Excel】数据透视表月度数据排序不正确
  • 智能座舱测试用例编写
  • MCU开发主要是项目移植吗?
  • 基于SiamFC的红外目标跟踪
  • java 多租户的产品设计思路
  • HCIP第十三天
  • leetcode 718 最长公共子数组
  • 汉诺塔问题——用贪心算法解决
  • Java数据库连接池详解:类型、特点、区别及配置方式
  • OpenCV 关键点定位
  • 在 Java 中实现异步编程:CompletableFuture 使用指南!
  • app逆向专题五:新快报app数据采集
  • wx212基于ssm+vue+uniapp的科创微应用平台小程序
  • 7个向量数据库对比:Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant
  • 详解 Https 和加密、摘要、签名、数字证书
  • 第十一天 - MySQL/SQLite操作 - 数据库备份脚本 - 练习:监控数据存储系统
  • 阿里通义实验室发布图片数字人项目LAM,实现高保真重建
  • 怎么免费下载glb格式模型、和gltf格式文件模型,还可以在线编辑修改