如何开始搜索?

<?php
// 引入
require_once './sdk/xs/lib/XS.php';

// 创建xs
$xs = new XS('my');
$search = $xs->search; // 获取 搜索对象

典型处理

<?php
// 引入
require_once './sdk/xs/lib/XS.php';

// 创建xs
$xs = new XS('demo');
$search = $xs->search; // 获取 搜索对象

$query = '项目测试'; // 这里的搜索语句很简单,就一个短语

$search->setQuery($query); // 设置搜索语句
$search->addWeight('subject', 'xunsearch'); // 增加附加条件:提升标题中包含 'xunsearch' 的记录的权重
$search->setLimit(5, 0); // 设置返回结果最多为 5 条,并跳过前 0 条

$docs = $search->search(); // 执行搜索,将搜索结果文档保存在 $docs 数组中
$count = $search->count(); // 获取搜索结果的匹配总数估算值

foreach ($docs as $doc)
{
    echo $doc->rank() . ". " . $doc->subject . " [" . $doc->percent() . "%]\n";
    echo $doc->message . "\n";
}

echo "共".$count."个";

快捷操作

<?php
// 引入
require_once './sdk/xs/lib/XS.php';

// 创建xs
$xs = new XS('demo');
$search = $xs->search; // 获取 搜索对象

$count = $search->count('项目测试');
$docs = $search->search('项目测试');

foreach ($docs as $doc)
{
    echo $doc->rank() . ". " . $doc->subject . " [" . $doc->percent() . "%]\n";
    echo $doc->message . "\n";
}

echo "共".$count."个";

搜索中的串接操作

<?php
// 引入
require_once './sdk/xs/lib/XS.php';

// 创建xs
$xs = new XS('demo');
$search = $xs->search; // 获取 搜索对象

$count = $search->count('项目测试');
$docs = $search->setQuery('项目测试')->addWeight('subject', 'xunsearch')->setLimit(5, 0)->search();

foreach ($docs as $doc)
{
    echo $doc->rank() . ". " . $doc->subject . " [" . $doc->percent() . "%]\n";
    echo $doc->message . "\n";
}

echo "共".$count."个";

构建搜索语句

1.典型搜索语句

$search->search('上海人民公园'); // 检索 body 型字段及混合区
$search->search('上海 人民公园'); // 用空格连接 2 个关键词, 这种情况比上面的用法更明确
$search->search('subject:上海 人民公园'); // 特别要求 subject 字段包含 "上海"
$search->setFuzzy()->search('上海公园'); // 开启模糊搜索,搜索 "上海" 或 "公园"

使用空搜索条件进行搜索,其含义相当于全部匹配

2.布尔搜索
多个词语之间的“并且”、“或者”、“异或”关系

$search->search('杭州 西湖');
$search->search('杭州 AND 西湖'); // 这两者效果是相同的
 
$search->setFuzzy()->search('杭州 西湖');
$search->search('杭州 OR 西湖');  // 这两者效果相同,都是只要求匹配其中一个
 
$search->search('杭州 XOR 西湖'); // 表示必须包含其中一个词,并且不允许同时包含这两个词。

要求搜索结果中不含特定关键词

$search->search('神雕侠侣 -电视剧'); // 正确用法1
$search->search('神雕侠侣 NOT 电视剧'); // 正确用法2

组合关系的括号表达式

// 要求结果包含 “杭州+西湖” 或 “杭州 + 西溪湿地”,并且不能包含 “汽车 火车”
$search->search('((杭州 AND 西湖) OR (杭州 AND 西溪湿地)) NOT (汽车 火车)');

3.精确搜索
使用双引号进行精确匹配

$search->search('上海科技大学');
// 这时内部把搜索语句切割为:上海+科技+大学,要求搜索结果同时包含这三个词即可,
// 但不要求它们的出现顺序,有可能先出现”科技“再出现”上海“,也有可能这三个词离得很远。
 
$search->search('"上海科技大学"');
// 加上引号后,要求搜索结果必须依次出现”上海+科技+大学“,要显得精准很多。

4.索引词之间的距离查询

$search->search('杭州 NEAR 西湖'); // 要求结果中出现 "杭州" 和 "西湖",并且距离不超过 10 个词
$search->search('杭州 NEAR/5 西湖'); // 要求它们距离不超过 5个词
$search->search('杭州 ADJ 西湖'); // 要求结果中先出现 "杭州" 再出现 "西湖",并且距离不超过 10 个词
$search->search('杭州 ADJ/3 西湖'); // 要求它们距离不超过 3个词

字段值区间搜索

$from = strtotime("2011-1-1"); // 起始时间 2011年1月1日
$to = strtotime("2011-9-1"); // 结束时间 2011年9月1日
 
// 1. <= $to: 要求结果的时间必须在 2011-9-1 之前,并且包含 2011-9-1
$docs = $search->setQuery('杭州')->addRange('chrono', null, $to)->search();
 
// 2. >= $from: 要求结果的时间必须在 2011-1-1 之后,并且包含 2011-1-1
$docs = $search->setQuery('杭州')->addRange('chrono', $from, null)->search();
 
// 3. > $from && <= $to: 要求结果的时间必须在 2011-1-1 之后 并且 2011-9-1 之前
$docs = $search->setQuery('杭州')->addRange('chrono', $from, $to)->search();

按字段索引词加权

// 搜索包含 "杭州" 的结果,并且提升 subject 字段包含 "西湖" 的数据的排序
$docs = $search->setQuery('杭州')->addWeight('subject', '西湖')->search();