精华内容
下载资源
问答
  • PHP实现全文索引,使用讯搜(官方网站http://www.xunsearch.com/) 1.安装 目前讯搜只能安装在linux系统,官方安装文档:http://www.xunsearch.com/doc/php/guide/start.installation 安装步骤: # 下载安装包 ...

    PHP实现全文索引,使用讯搜(官方网站http://www.xunsearch.com/

    1.安装

    目前讯搜只能安装在linux系统,官方安装文档:http://www.xunsearch.com/doc/php/guide/start.installation

    安装步骤:

    # 下载安装包
    wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
    
    # 解压 如果报错tar (child): lbzip2: Cannot exec: No such file or directory 则安装bzip2,执行命令: yum -y install bzip2
    tar -xjf xunsearch-full-latest.tar.bz2
    
    # 安装
    cd xunsearch-full-1.3.0/
    sh setup.sh
    # 中途需要输入安装路径,我这边的安装路径是 /opt/www/xunsearch,记得先创建好路径
    
    # 安装完成会提示启动命令,其实就是安装路径下bin/xs-ctl.sh restart
    # 启动服务
    /opt/www/xunsearch/bin/xs-ctl.sh restart

    启动完成后可以输入命令查看服务的运行状态: ps -ef | grep xs-searchd

    安装完成

    2.PHP使用讯搜 

    首先创建数据库配置文件,官方建议我们数据库配置文件都统一放在安装路径下/sdk/php/apk/下,我这边创建一个新闻数据库:

    /opt/www/xunsearch/sdk/php/apk/news.ini

    内容如下:

    project.name = news
    project.default_charset = utf-8
    server.index = 8383
    server.search = 8384
    
    [pid]
    type = id
    
    [subject]
    type = title
    
    [message]
    type = body
    
    [chrono]
    type = numeric

    代码中调用讯搜的逻辑是:

    (1)新增索引

    (2)搜索

    代码中调用讯搜必须引入/opt/www/xunsearch/sdk/php/lib/XS.php,下面是新增索引的代码例子:

    <?php
    
    require_once '/opt/www/xunsearch/sdk/php/lib/XS.php';
    
    try{
    	$xs = new XS('/opt/www/xunsearch/sdk/php/apk/news.ini');
    	$index = $xs->index;
    
    	$doc = new XSDocument;
    	// 添加文章1的索引
    	$doc->setFields(array(
    		'pid' => 1, // 唯一ID
    		'subject' => '炸带鱼时,拍面粉还是淀粉?原来很多人都做错了,这才是正确方法',  // 文章标题
    		'message' => '', // 内容 因为我这边只希望根据标题搜索,所以内容为空
    		'chrono' => time() // 设置这个值后面排序用到
    	));
    	$index->add($doc);
    
    	// 添加文章2的索引
    	$doc->setFields(array(
    		'pid' => 2,
    		'subject' => '戒烟那么难,为什么还是劝你试?这些好处一个月就能体现',
    		'message' => '',
    		'chrono' => time()
    	));
    	$index->add($doc);
    }catch(XSException $e) {
    	print_r($e);
    }

    搜索代码例子:

    <?php
    
    require_once '/opt/www/xunsearch/sdk/php/lib/XS.php';
    
    try{
    	$xs = new XS('/opt/www/xunsearch/sdk/php/apk/news.ini');
    	// setFuzzy 开启模糊搜索,让搜索结果更加广泛
    	// setSort('chrono') 设置排序为chrono值倒序
    	// setLimit(10, 5) 获取结果最大10条,从第5条开始
    	// search('世界') 搜索关键词
    	$docs = $xs->search->setFuzzy()->setSort('chrono')->setLimit(10, 5)->search('世界');
    
    }catch(XSException $e) {
    	print_r($e);
    }

    获取分词代码例子:

    <?php
    
    require_once '/opt/www/xunsearch/sdk/php/lib/XS.php';
    
    try{
    	$xs = new XS('/opt/www/xunsearch/sdk/php/apk/news.ini');
    	$xs_token = new XSTokenizerScws();
    	return $xs_token->getResult('炸带鱼时,拍面粉还是淀粉?原来很多人都做错了,这才是正确方法');
    
    }catch(XSException $e) {
    	print_r($e);
    }

    更多的功能参考官方文档http://www.xunsearch.com/doc/php/guide/start.overview , http://www.xunsearch.com/doc/php/api

    下面是实际开发应用整理的使用讯搜的工具类:

    <?php
    
    require_once '/opt/www/xunsearch/sdk/php/lib/XS.php';
    
    class MyXS {
    
    	protected $xs;
    	protected $xs_doc;
    	protected $xs_token;
    
    	function __construct() {
    		$this->xs = new XS(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'news.ini');
    		$this->xs_doc = new XSDocument;
    		$this->xs_token = new XSTokenizerScws;
    	}
    
    	/* 添加索引 */
    	public function addIndex($pid, $subject, $chrono = null) {
    		$this->xs_doc->setFields(array(
    			'pid' => $pid,
    			'subject' => $subject,
    			'message' => '',
    			'chrono' => empty($chrono) ? time() : $chrono
    		));
    		$this->xs->index->add($this->xs_doc);
    	}
    
    	/* 搜索 */
    	public function search($key, $step = 20, $start = 0) {
    		$docs = $this->xs->search->setFuzzy()->setSort('chrono')->setLimit($step, $start)->search($key);
    		$result = array();
    		foreach ($docs as $key => $value) {
    			$result[$value['pid']] = $value['subject'];
    		}
    		return $result;
    	}
    
    	/* 分词 */
    	public function getToken($str) {
    		$result = $this->xs_token->getResult($str);
    		$token = array();
    		foreach ($result as $key => $value) {
    			$token[] = $value['word'];
    		}
    		return $token;
    	}
    
    	/* 清空索引 */
    	public function clearIndex() {
    		$this->xs->index->clean();
    	}
    
    }

     

    展开全文
  • 确实有很多方法来给php提供全文索引功能。 例如: 1。solr或者lucene,(需要安装对应的php客户端扩展)。 2。sphinx 3。基于任何一个数据库(key/value的最好)的模拟实现。 4。Mysql的全文索引。 5。自己给php...

    确实有很多方法来给php提供全文索引功能。


    例如:

    1。solr或者lucene,(需要安装对应的php客户端扩展)。

    2。sphinx

    3。基于任何一个数据库(key/value的最好)的模拟实现。

    4。Mysql的全文索引。

    5。自己给php加上全文索引扩展。(就因为这一点,可以说有太多的实现方法了)


    本文要介绍的是第四种,使用MySQL的全文索引来实现php的全文检索功能。

    一。前提

    MySQL数据表引擎要是MyISAM (Mysql的ISAM索引结构的实现)


    二。准备:

    假设建立如下一个简易的文章表格:

    +------+---------+-----------+--------------------------------------+
    | Id   | title   | author    |  content    | c_idx(text,fulltext)      |
    +------+---------+-----------+------------------------------------+

    其中content为原文,c_idx为中文分词后的base64编码串接字符串,并且为fulltext索引。

    请看下文。


    三。实现分析:

    1。如果要被检索的内容是英文的,那么要做的事情很简单,给要检索的字段加上一个fulltext索引就可以了。

    2。如果被检索的内容是CJK字符集合或者是CJK和英文的混合的话那问题就来了。(我们都知道,MySQL的全文索引不支持中文分词)。

    能不能把分词之后中文转换成英文呢?

    对,我就是这么想的:

    将文章内从content字段的内容进行中文分词,然后将得到的词条转换成英文,再将转换后的词条使用空格串接起来,写入数据库即可。

    这需要解决两个问题:

    (1).中文分词:

    这是搜索引擎的难点之一。速度和准确率是其瓶颈所在。

    这里我推荐本人的开源php中文分词扩展robbe,robbe是建立在开源高性能中文分词组建friso上的一个php扩展。也是鄙人的作品。分词速度和准确率都不错。

    (2).将中文字符串转换成英文字符串:

    使用什么编码呢?想来想去,试来试去,发现base64编码最适合了。(如果有发现更好的编码,请比吝赐教测叫,在此先谢了)。

    base64的编码和解码速度都很快。

    另外编码后的文本所占的空间比编码前的文本只多一点(比原来长1/3)。

    (另外,base64编码后的字符串中可能会包含+和/字符,会影响要MySQL对英文分词,所系需要手动替换一下)


    四。具体实现:

    <?php
    $content = $_POST['content'];  //过滤什么的,就是你的事情啦。
    
    //1.使用复杂模式,对文本进行分词。
    //@see robbe文档 https://code.google.com/p/robbe/wiki/RobbeFunctions
    $_result = rb_split($content, __RB_COMPLEX_MODE__);
    
    //2.进行base64编码,并且使用空格串接分词结果。
    $_str = '';
    foreach ( $_result as $_value ) {
        $_str .= ' '.base64_encode($_value);
    }
    
    //3.写入文本到fulltext数据表中。
    ?>


    1.查询SQL:

    select 字段列表 from #_table where Match(c_idx) Against(检索字符串);
    
    或者:
    
    select #_files, Match(c_idx) Against(检索字符串) AS rank from #_table order by rank

    返回的结果是自动根据相关度排序的。

    2.或者使用bool模式:

    select #_files from #_table where Match(c_idx) Against(检索字符串 IN BOOLEAN MODE)

    常用布尔操作符:

    +    包含,词必须存在。

    -    排除,词必须不出现。

    >    包含,而且增加等级值

    <    包含,而且减少等级值

    ()    吧词组合成一个表达式。

    ~    取消一个词的排序值。

    *    词尾通配符。

    ""    定义一个短语。

    例如:

    select content from article where Match(c_idx) Against('+你好的base64编码字符串 +我们的base64编码字符串' IN BOOLEAN MODE)

    查询包含你好和我们的记录。

    -----------------------------------------------

    select content from article where Match(c_idx) Against('你好的base64编码字符串 我们的base64编码字符串' IN BOOLEAN MODE)

    查询至少包含“你好”和“我们”中的一个的记录。

    -----------------------------------------------

    select content from article where Match(c_idx) Against('“你好的base64编码字符串 我们的base64编码字符串”' IN BOOLEAN MODE)


    搜索匹配短语:“你好 我们”

    -----------------------------------------------

    select content from article where Match(c_idx) Against('>你好的base64编码字符串 <我们的base64编码字符串' IN BOOLEAN MODE)

    匹配“你好”和“我们”,并且增加“你好”的等级,减少“我们”的等级。

    3.使用查询扩展:4.11或者更高版本才支持。

    select #_files from #_table where Match(c_idx) Against(检索字符串 WITH QUERY EXPANSION)

    五。效率分析:

    对于一般数据来的网站,例如:个人博客,企业文章,新闻什么的,(60W以下的数据记录条数)

    使用此方法可以比较好的解决搜索问题,但是数据量大时,并不是很好的解决办法。

    30W的数据记录(平均大小10K),平均查询0.02sec的样子。还算不错吧。

    索引的内容不一定是全文(即c_idx字段的内容),可以是人工筛选后的核心性词组合。那样可以达到更好的检索效果和更快的检索速度。

    转载于:https://my.oschina.net/jcseg/blog/111106

    展开全文
  • 如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。 show variables like 'ft%';查看mysql配置ft_min_word_len检索最小单位长度,...

    注意事项

    1. 如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。
    2. show variables like 'ft%';查看mysql配置ft_min_word_len检索最小单位长度,默认为4,更改为1,然后重启mysql,必须重建所有fulltext index(这个很重要,不重建可能会不生效)

    sql写法

    直接检索:

    where MATCH (title,content) AGAINST ('关键字' in boolean mode)
    

    关键字搜索语法规则:

    + 一定要有(不含有该关键词的数据条均被忽略)。
    - 不可以有(排除指定关键词,含有该关键词的均被忽略)> 提高该条匹配数据的权重值。
    < 降低该条匹配数据的权重值。
    ~ 将其相关性由正转负,表示拥有该字会降低相关性(但不像 - 将之排除),只是排在较后面权重值降低。
    * 万用字,不像其他语法放在前面,这个要接在字符串后面。
    " " 用双引号将一段句子包起来表示要完全相符,不可拆字。 
    

    使用排序:

    select a.*,(MATCH (a.title) AGAINST ('关键字' in boolean mode)) as fulltext_words from table_name a where MATCH (a.title) AGAINST ('关键字' in boolean mode) order by fulltext_words desc
    
    展开全文
  • 一般现在的搜索引擎分为两部分,一部分是是分词,另外一部分是建立全文索引全文索引就是基于分词结果给没一个词都建立一个索引,我这里基于hash索引简单实现了一下全文索引
  • mongoDB全文索引

    2014-11-11 17:36:00
    相关文章:php使用Coreseek实现全文索引 Introduction Mongo provides some functionality that is useful for text search and tagging. MongoDB提供了一些拥有的功能用于全文搜索与标记。 Multikeys (Indexing...

    相关文章:php使用Coreseek实现全文索引

    Introduction
    Mongo provides some functionality that is useful for text search and tagging.
    MongoDB提供了一些拥有的功能用于全文搜索与标记。

    Multikeys (Indexing Values in an Array)多建(数组中得索引值)
    The Mongo multikey feature can automatically index arrays of values. Tagging is a good example of where this feature is useful. Suppose you have an article object/document which is tagged with some category names:

    obj = {
      name: "Apollo",
      text: "Some text about Apollo moon landings",   //正文
      tags: [ "moon", "apollo", "spaceflight" ]      //索引标记
    }

    and that this object is stored in db.articles. The command

    db.articles.ensureIndex( { tags: 1 } );
    will index all the tags on the document, and create index entries for “moon”, “apollo” and “spaceflight” for that document.

    索引使用例子
    You may then query on these items in the usual way:

    &gt; print(db.articles.findOne( { tags: "apollo" } ).name);

    Apollo
    The database creates an index entry for each item in the array. Note an array with many elements (hundreds or thousands) can make inserts very expensive. (Although for the example above, alternate implementations are equally expensive.)

    Text Search
    It is fairly easy to implement basic full text search using multikeys. What we recommend is having a field that has all of the keywords in it, something like:

    { title : "this is fun" ,
      _keywords : [ "this" , "is" , "fun" ]
    }

    Your code must split the title above into the keywords before saving. Note that this code (which is not part of Mongo DB) could do stemming, etc. too. (Perhaps someone in the community would like to write a standard module that does this…)

    相关文章:php使用Coreseek实现全文索引

    转载请注明:FKBlog » mongoDB全文索引(http://www.fkblog.org/blog485)

    转载于:https://www.cnblogs.com/seasonzone/p/4090116.html

    展开全文
  • mysql中文全文索引

    2016-03-04 09:56:53
    原文地址:mysql中文全文索引作者:hulang参考:http://www.s135.com/read.php/356.htm MySQL在高并发连接、数据库记录数较多的情况下,SELECT ... WHERE ... LIKE '%...%'的全文搜索方式不仅效率差,而且以通配符%...
  • Mysql 中文全文索引 案例在PHP+MySQL构架的网站中,大数据量的全文检索一般都会用到MySQL的FULLTEXT全文索引,通过SELECT…MATCH…AGAINST语句来进行查找。迄今为止,MySQL对中文全文索引无法正确支持,MySQL是不会...
  • 斯芬克斯全中文搜索引擎加自动分词mysql+swsc+php全文索引
  • 全文索引介绍和示例

    千次阅读 2018-06-07 11:30:50
    参考整理自:https://www.cnblogs.com/jimmy-muyuan/p/5874410.htmlhttps://www.cnblogs.com/php-linux/p/6565268.html全文索引MySQL支持全文索引(Full-Text) ,目前,fulltext是一种只适用于MyISAM表的一个索引类型...
  • ITPUB知识索引贴——全文索引 http://www.itpub.net/forum.php?mod=viewthread&tid=1314534&highlight=ITPUB%D6%AA%CA%B6%CB%F7%D2%FD%CC%F9
  • Sphinx全文索引引擎

    2019-10-01 11:30:36
    原理:sphinx将数据库中的表建立索引php操作sphinx时,将要查询的关键字进行匹配,返回一个id,php通过id到数据库中查询数据。 二、下载 链接:https://pan.baidu.com/s/1ic3JTra4NKbEgxV0bAjXsw 提取码:b436 ...
  • 网上找了N多关于PHP+MYSQL中文全文索引的文章都没有一个好用的,对于一般的菜鸟根本不知道怎么使用,PHP中文分词有DDEDE的,DEDE的词库不是很强大,还算可以用吧! 还有一个是《SCWS - 简易中文分词系统》这个目前...
  • sphinx简介+全文索引

    2015-12-08 10:21:29
    Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,...
  • Sphinx全文索引 第一节

    2016-09-25 18:27:00
    1 使用场景:用来解决站内搜索的一些应用场景。 网站中的搜索(站内搜索)... MySQL全文索引引擎也可以解决站内搜索,当数据库某张表数据量大的时候,做搜索花费时间多。 MySQL:添加索引 alert table 表名 add ind...
  • 全文索引 Lucene初探

    2015-11-12 09:46:37
    文章可以当做php 理解,写的挺好的。  讲解之前,先来分享一些资料    首先呢,学习任何一门新的亦或是旧的开源技术,百度其中一二是最简单的办法,先了解其中的大概,思想等等。这里就贡献一个讲解很...
  • ORACLE 11G使用全文索引

    千次阅读 2011-10-27 21:28:38
    ORACLE 11G使用全文索引 http://www.alidba.net/index.php/archives/234
  • 原文地址:http://cloudbbs.org/forum.php?mod=viewthread&tid=7992 目录: 须知 --------------------------------- 1楼 一.安装 ------------------------------ 1楼 二.配置 ---------------------...
  • MySQL全文索引 Fulltext

    2011-09-28 16:58:49
    讨论地址:http://www.minioa.net/viewtopic.php?f=24&t=259 搜索记录时,我们经常会用到like,然而这样的效率很低。 后来有人推荐可以使用regexp, 这里,我们要介绍的是Fulltext 首先,要确保你的MySQL版本...
  • TNTSearch 轻量级全文索引+中文分词 选用 TNTSearch 的原因:轻,方便移植,不需要额外安装服务,能减少后期维护的工作量。搜索的效果也还不错,可以满足大多数项目场景,如果对性能和精准度要求较高,还是使用 ...
  • [MySQL] - 全文索引

    2010-11-16 08:11:00
    注意:全文索引1. 表类型为MyISAM时才支持fulltex 2. 如果一个关键字在数据中50%以上的记录行中都存在的话,这个词将被处理为stopword, 这时将搜索出结果为 empty set.因为能够匹配表中一半记录行以上的词很少可能...
  • 假设有两张那个表,分别为articles,article_photos两张表。搜索的时候,要匹配articles.title、articles.intro、...PHP页面 header("content-type:text/html;charset=utf8"); include './sphinxapi.php'; //包...
  • PHP 和 MySQL 几乎也是离不开的, 后面我附一个简单的例子来说明在 PHP 中使用全文检索.... <br />下载及完全说明正式地址: http://myft.twomice.net<br /><br />在不影响 MySQL 的系统结构及其他功能的前提下,...
  • 全文检索的索引创建过程一般有以下几步:1、一些需要创建索引的文档(Documents)。 2、将原文档传给分词组件(Tokenizer)。 3、将得到的词元(Token)传给语言处理组件(Linguistic Processor)。 4、将得到的词...
  • 但是在PHP上或ASP上执行时就会出现问题。 如:多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。 还有的是循环到第五个记录就提示BOF还是EOF等于真 就没记录了。 ASP和PHP的查询...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 330
精华内容 132
热门标签
关键字:

php全文索引