胖球爱好者 發表於 2023-7-14 00:00:00

discuzx3.1文章进行全文检索的实现方法

<p>
首先说明啊,这个检索是直接用like来弄的,所以,如果你的站数据量大,这样很吃系统,自己掂量着办,我研究了下利用sphinx的,结果搞定了才发现这个只是针对论坛的帖子。搜索门户中的文章,并不是按这个走的,而且利用sphinx这个啊,要么只能分中文要么只能分英文(学艺不精没细了解啊,个人测试是这样的)。而我目前碰到的要求是需要对文章也执行like。所以,经过研究,类比了下搜索文章标题的功能,成功实现了discuzX3对门户中的文章进行全文检索的功能,以下操作方法discuz版本为20140101的X3.1。具体方法如下:<br><br>
1.用notepad++或其他文本编辑器打开下述文件</p>
<p>
网站目录\source\class\table\table_portal_article_content.php<br>
2.在下面的<br>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode7">
<br>
class table_portal_article_content extends discuz_table<br>
{</div>
<p>
<br><span>后添加</span></p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode8">
<br>
public function fetch_all_by_sql($where, $order = '', $start = 0, $limit = 0, $count = 0, $alias = '') {<br>
$where = $where &amp;&amp; !is_array($where) ? " WHERE $where" : '';<br>
if(is_array($order)) {<br>
$order = '';<br>
}<br>
if($count) {<br>
return DB::result_first('SELECT count(*) FROM '.DB::table($this-&gt;_table).' %i %i %i '.DB::limit($start, $limit), array($alias, $where, $order));<br>
}<br>
return DB::fetch_all('SELECT * FROM '.DB::table($this-&gt;_table).' %i %i %i '.DB::limit($start, $limit), array($alias, $where, $order));<br>
}</div>
<p>
<br><span>变为:</span></p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode9">
<br>
class table_portal_article_content extends discuz_table<br>
{<br>
public function fetch_all_by_sql($where, $order = '', $start = 0, $limit = 0, $count = 0, $alias = '') {<br>
$where = $where &amp;&amp; !is_array($where) ? " WHERE $where" : '';<br>
if(is_array($order)) {<br>
$order = '';<br>
}<br>
if($count) {<br>
return DB::result_first('SELECT count(*) FROM '.DB::table($this-&gt;_table).' %i %i %i '.DB::limit($start, $limit), array($alias, $where, $order));<br>
}<br>
return DB::fetch_all('SELECT * FROM '.DB::table($this-&gt;_table).' %i %i %i '.DB::limit($start, $limit), array($alias, $where, $order));<br>
}</div>
<p>
<br><span>上面添加那个方法才能用$query = C::t(‘portal_article_content’)-&gt;fetch_all_by_sql。</span></p>
<p>
 </p>
<p>
3.打开</p>
<p>
网站目录\source\module\search\search_portal.php</p>
<p>
搜索<br>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode10">
&lt;/p&gt; &lt;p&gt; foreach($query as $article) {<br>
$ids .= ','.$article['aid'];<br>
$num++;<br>
}</div>
<p>
<br><span>在其后添加如下代码:</span></p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode11">
<br>
if($num==0){<br>
list($srchtxt, $srchtxtsql) = searchkey($keyword, "content LIKE '%{text}%'", true);<br>
$query = C::t('portal_article_content')-&gt;fetch_all_by_sql(' 1 '.$srchtxtsql, 'ORDER BY aid DESC ', 0, $_G['setting']['search']['portal']['maxsearchresults']);<br>
foreach($query as $article) {<br>
$ids .= ','.$article['aid'];<br>
$num++;<br>
}<br>
}</div>
<p>
 </p>
<p>
上面代码的意思是,如果搜标题没搜到,那就用like来搜文章的内容。<br>
保存后,更新下discuz的缓存,搜文章里的内容试试,如果能搜到,OK,大功告成~</p>
頁: [1]
查看完整版本: discuzx3.1文章进行全文检索的实现方法