问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql全文搜索,多个关键词权重排序

发布网友 发布时间:2022-04-25 15:01

我来回答

2个回答

热心网友 时间:2022-04-08 02:51

自己在写一个web,希望对数据库做全文检索。但是google了解到,由于中文分词的缘故,mysql只支持英文的全文搜索,想支持中文的,需要各种插件or实现一些比较复杂的机制,而买的虚拟主机并不支持这些复杂的东西。仔细想了下,因为自己需求的功能也比较简单,主要是2个字段的搜索,且数据量不大,即便增加几个字段,需要多运行几个select也不会对速度有太大影响,所以通过一些work around实现了需求。Step 1:用locate进行简单的搜索Locate可以判断子串是否在子乱 有两个column,一个name,一个description.所以可以用LOCATE>0去判断是否关键字在其中出现了。 其实就是 SELECT * FROM table WHERE LOCATE(key, 'name')>0 OR LOCATE(key, 'description);这样,我们就简单实现了对某个key在两个域的搜索Step 2:搜索多个关键字 通常,搜索都是有多个关键字,所以我们需要对每个关键字,执行下Step1的查询。(当然,也可以合成一个,这里偷懒每次只查询1个关键字) 然后,我们再将每次查询出的数组都合并,这样就得到了一个最终的集合。php代码如下:
function selectlocate($tarcols,$skey){ 
    $where ="";
    $connector = " ";
    global $count;
    foreach($tarcols as $tarcol ){
        $where .= $connector;
        $where .= "LOCATE('$skey', $tarcol) != 0  ";
        if($connector == " "){
            $connector = " OR ";
        }
    }
    $sql = "SELECT * FROM pets_table WHERE $where";
    $result = mysql_query($sql);
    $ret = Array();
    while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
        $count ++;
        $ret[] = $item;
    }
    return $ret;
}
Step 3:匹配的权重 上面Step2的结果,其实是无序的。通常,如果我们搜索一个字段:1.如果这个字段和关键字完全相同,那么一般来讲,可能这个结果应该是相关度最高的2.如果他只是其其中出现了一次,相关度就最低。3.如果他出现的次数比在其他row中出现的次数高,那么他的相关度就比2中的结果高 所以,搜索的时候依据这个顺序考虑权重,a.如果完全相等,权重为1000 b.如果出现1次,权重为10,出现n次c.权重为n*10每次搜索出来的结果附加上权重----》然后合并相同项----》并把权重累加 最后按权重排序,即可得到一个有排序的搜索结果。 以下是两种1关键字对应1个字段(上面的代码是1关键字多个字段)查询的代码(不包含合并两个数组的代码,相关的代码在Step4中),只需遍历每个关键字和字段,就能完成搜索
$count = 0; 
function selectequal($col,$skey){
    $connector = " ";
    global $count;
    $sql = "SELECT * FROM pets_table WHERE LOWER($col)=LOWER('$skey')";
    $result = mysql_query($sql);
    $ret = Array();
    while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
        $count ++;
        $item["weight"] = 1000;
        $ret[] = $item;
    }
    return $ret;
}
function selectlocate($col,$skey){
    global $count;
    $sql = "SELECT *,(LENGTH(description) - LENGTH(REPLACE(description, '$skey', '')))/LENGTH('$skey') *10 as weight FROM pets_table WHERE LOCATE(LOWER('$skey'),LOWER($col))>0";
    $result = mysql_query($sql);
    $ret = Array();
    while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
        $count ++;
        $ret[] = $item;
    }
    return $ret;
}
 Step 4: 字段的权重 在我的需求中,显然name这个字段比description更重要,所以在匹配时,对name字段的结果应该有所倾斜,所以,又可以增加一个对字段的权重系数。1.如果是在name域的匹配,设系数为10;2.如果是在description匹配,设系数为1; 将Step 3每次计算得出的权重,再乘上这个系数,就可以得到一个新的,更有效的权重值。 最后按权重排序,即可得到一个最有相关度排序的搜索结果 其他的细节: 如果一个关键字已经满足了equal条件,那么再使用locate条件的时候会依然返回一个结果,所以在使用locate条件的时候,过滤掉equal的情况
点击(此处)折叠或打开
<?php 
$count = 0;
function selectequal($col,$val,$skey){
    $connector = " ";
    global $count;
    $sql = "SELECT * FROM pets_table WHERE LOWER($col)=LOWER('$skey')";
    $result = mysql_query($sql);
    $ret = Array();
    while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
        $count ++;
        $item["weight"] = 1000*$val;
        $ret[] = $item;
    }
    return $ret;
}
function selectlocate($col,$val,$skey){
    global $count;
    $sql = "SELECT *,(LENGTH(description) - LENGTH(REPLACE(description, '$skey', '')))/LENGTH('$skey') *10*$val as weight FROM pets_table WHERE LOCATE(LOWER('$skey'),LOWER($col))>0 AND LOWER($col)!=LOWER('$skey')";
    $result = mysql_query($sql);
    $ret = Array();
    while($item = mysql_fetch_array($result, MYSQL_ASSOC)){
        $count ++;
        $ret[] = $item;
    }
    return $ret;
}
function cleanarr($arr){
    global $count;
    $tmp = Array();
    $tmpall = Array();
    foreach($arr as $item){
        if(array_key_exists($item['uid'], $tmp)){
            $tmp[$item['uid']]+=$item["weight"];
        }
        else{
            $tmp[$item['uid']] = $item["weight"];
            $tmpall[$item['uid']] = $item;
        }
    }
    //sort by weight in descending order 
    arsort($tmp);
    $ret = Array();
    //rebuild the return arary 
    $count = 0;
    foreach($tmp as $k=>$v){
        $count++;
        $tmpall[$k]['weight']=$v;
        $ret[]=$tmpall[$k];
    }
    return $ret;
}
require_once("consvr.php");
    $colshash = array("name"=>10,"description"=>1);
    $ret = Array();
    $keywords=explode(" ", $keywords);
    $cols = array_keys($colshash);
    foreach($keywords as $keyword){
        foreach($colshash as $col=>$val){
            $ret = array_merge($ret,selectequal($col,$val, $keyword));
            $ret = array_merge($ret,selectlocate($col,$val, $keyword));
        }
        
    }
    $ret = cleanarr($ret);
    $ret = array('msg' => "Success", 'count'=>$count,'children' => $ret, 'query'=>"COMPLEX:NOT READABLE");
    echo json_encode($ret);
    mysql_close();
?>

追问我也是醉了,怎样删除这种垃圾回答?除了一整段的复制还会什么?

热心网友 时间:2022-04-08 04:09

多个关键字先分割然后: like %权重%排序%
mysql全文查找matchagainst模式怎样实现中文多词模糊

全文索引默认按照id从高到低排序。在进行爬虫数据采集时,可利用全文索引提高检索效率。在使用全文索引时,应合理配置ngram_token_size等参数,以优化查询效率和性能。通过正确配置和利用全文索引,可显著提升数据检索的效率和效果。

mysql怎么用

1. 搜索特定关键词:如查询住址在北京的学生,使用`SELECT student_id, student_name FROM students WHERE CONTAINS(address, 'beijing')`,单个词组需要用单引号包围。2. 多词组搜索:查询地址包含特定词组,如'HEIBEI province',则为`SELECT * FROM students WHERE CONTAINS(address, '"HEIBEI provin...

全文搜索之MySQL与ElasticSearch搜索引擎

MySQL支持全文索引和搜索功能。在MySQL中可以在CHAR、VARCHAR或TEXT列使用FULLTETXT来创建全文索引。 FULLTEXT索引主要用MATCH()...AGAINST语法来实现搜索:MySQL的全文搜索存在以下局限:通常来说MySQL自带的全文搜索使用起来局限性比较大,性能和功能都不太成熟,主要适用于小项目,大项目还是建议使用elasti...

Python做个搜索引擎(4)网页蜘蛛之工作原理

首先,我们需要考虑如何在爬取过程中保持域名的顺序性,确保每个域名都有机会被爬取。为此,我们利用MySQL数据表中的`lastFetchDT`和`nextFetchDT`字段进行排序。`nextFetchDT`表示计划爬取时间,越早的域名应优先爬取;`lastFetchDT`表示最后爬取时间,越早的域名应排在后面重新排队。在初始阶段,我们...

mysql中间件有哪些

主库可设置多项,用逗号分隔,从库可设置多项和权重,达到负载均衡。4.自己实现分表 (1)需带有分表字段。(2)支持SELECT、INSERT、UPDATE、DELETE、REPLACE语句。(3)支持多个子表查询结果的合并和排序。这里不得不吐槽Atlas的分表功能,不能实现分布式分表,所有的子表必须在同一台DB的同一个data...

mysql索引建多了有什么坏处

1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引;3、经常与其他表进行连接的表,在连接字段上应该建立索引;4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;5、索引应该建在选择性高的字段上;6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;...

学习seo用的工具和需要哪些基础的知识

1、学习seo必备网页制作语言:HTML语言、CSS语言、PHP+MYSQL(可选)HTML只要想要学习SEO,就是必备的基础,HTML语言也是比较简单易学的,搜索下HTML学习视频等的,看完一两个后就可以实战分析网页的html源码了;css语言,网站布局的语言,控制各个部分的布局的,这个也是必备的网页制作语言之一,相关的视频...

怎么让搜索你公司的时候,在百度上以图片和文字结合的形式展现出来?_百度...

你首页要公司介绍简短不超过25字的显示,关键设置为你公司名字,然后图片的alt标签要填上公司的名字 还有个重要的点,图片和文字,不能放flash里或者ifram框里。就是不能放在蜘蛛识别不到的地方。这样收录的话,一搜索就会这样显示 还有site必须是1,如果权重不在第一页,怎么做都没用。打字不容易,...

Es实现百万级数据快速检索

对于这样的需求,通俗来讲,就是需要通过增大某些搜索条件的权重,从而在搜索的结果中,更多符合和满足我们业务场景的数据靠前搜索出来,在es中可以通过boost关键词来增加搜索条件的权重, GET /forum/article/_search { "query": { "bool": { "must": [ { "match": { "title": "java" } } ], "should":...

什么叫爬虫技术?有什么作用?

3、网页分析 通过对网页数据进行爬虫采集,在获得网站访问量、客户着陆页、网页关键词权重等基本数据的情况下,分析网页数据,从中发现访客访问网站的规律和特点,并将这些规律与网络营销策略等相结合,从而发现目前网络营销活动和运营中可能存在的问题和机遇,并为进一步修正或重新制定策略提供依据。

关键词权重和搜索权重 关键词搜索和全文搜索 怎么提高关键词搜索权重 全文搜索是不是关键字查询 全文搜索和目录搜索 怎么提升关键词权重 关键词权重什么意思 怎么样刷关键词的权重 关键词权重如何计算
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
猫咪丢了之后心里很难过,然后男友担心我就重新去领养了一只小花猫,可是... 有关名侦探柯南黑暗组织!! qq上删除的好友怎么找回来,六个月以上的。只要能找到QQ号就行,我可以... 六个月内删掉的qq好友能找回吗? 急!!因欠费而停机的手机能收到短信吗 手机关机之后停机信息是否可以收到 手机欠费后冲了钱但还是欠费会收到短信吗 手机停机了,包月的流量没用完,能收到微信吗? 德州到潍坊用不用隔离? 南都周刊2011年有一篇社论≪躺在时间的河流上怀念他们≫写得很棒... mysql关键字和保留字的区别 mySQL中from关键字 mysql中的sql语句存在关键字怎么办? mysql中的sql语句存在关键字怎么办 存入mysql数据库怎么避免一些关键字,像一些词system,standard,存入数据库... 怎么查找一段文字中包含了mysql数据库中关键词的数据呢? mysql中的关键字问题 level是mysql关键字吗 mysql多表关键词查询 这个春节我很快乐作文800初中 mysql语句如何 批量在现有的数据库内插入关键词 mysql 中有什么关键字可以代替 sql语言中的 mysql关键字insert是什么意思 mysql修改数据表的语法结构,关键字有哪些 mysql数据库 怎么在多个表中 查找一个关键词 mysql 中怎么查找一个关键字 初中寒假日记20篇,每篇300字,其中有3到5篇过年的,求帮助 mysql数据库如何搜索关键词 300字初中生寒假日记,最好是初一年级的,关于过年啊之类的,5篇 梦见自己犯法被抓是什么意思? mysql中搜索所有含关键字的文章 不能调光的led灯能用无极调光驱动器吗 LED三色调光灯改成无级调光只需要换一个支持调光的驱动就可以了么? LLC无极调光调色温驱动和LED无极调光调色温驱动一样吗 逻辑思维缜密的表现? LED无极调光和分段调光的灯板是一样的吗,主要区别是在驱动吗?谢谢 逻辑思维好的人有什么特点? 无极调光led驱动45w可以带动多少w 无极调光led驱动电源(12——36w)X2坏了用(24╳36w)X2的驱动电源行不? 如何看一个人的逻辑思维能力强不强 逻辑性强的人的表现 无极调光调色led 驱动器上的mode:FS-01(50W 50W)X1是什么意思?丨 逻辑思维能力体现在哪些方面 无极调光led灯的分段开关和驱动器怎么连接 逻辑思维能力好的人可以将优势体现在哪些方面? 我有一个9头无极调光LED客厅灯和配套驱动哪个大神可以告诉我怎么接线啊 逻辑思维力一般都体现在一个人的日常生活的哪方面? 请问无极调光LED吸顶灯可以使用墙上的调光面板开关吗?谢谢 逻辑思维强的男人的表现 LED进行无极调光 用哪种调光方式最好?