xunsearch搜索使用
如何开始搜索?
<?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();