当前位置: 首页 > 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);
	}
}

相关文章:

  • 从三次方程到复平面:复数概念的奇妙演进(一)
  • 多光谱相机:海洋管道漏油(溢油)监测
  • 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 最长公共子数组
  • 汉诺塔问题——用贪心算法解决
  • 19岁女生注射头孢离世后续:院方道歉,医生停职,监管介入
  • 复旦大学文科杰出教授裘锡圭逝世,享年90岁
  • 硅料巨亏后弘元绿能割肉求生:逾12亿元内蒙古公司股权转让协鑫
  • Meta正为AI眼镜开发人脸识别功能
  • 自然资源部印发地理信息数据分类分级指南
  • 上海国际电影节特设“走进大卫·林奇的梦境”单元