項(xiàng)目dedecms二次開發(fā)-sphinx_第1頁
項(xiàng)目dedecms二次開發(fā)-sphinx_第2頁
項(xiàng)目dedecms二次開發(fā)-sphinx_第3頁
項(xiàng)目dedecms二次開發(fā)-sphinx_第4頁
項(xiàng)目dedecms二次開發(fā)-sphinx_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

傳智播客教育sphinx講師::為什么要用sphinx?當(dāng)對大文本數(shù)據(jù)進(jìn)行單詞匹配查詢時,一個歌曲,數(shù)據(jù)庫中收集著上百萬首歌曲的信息,如果要查詢出歌詞中帶“冬天”的所有歌曲,典型的做法是執(zhí)行如下SQL語句:SELECT

*

FROM

songs

WHERE

content

LIKE"%php%"。但是在MYSQL中以%開頭的查詢無法使用索引,所以這條SQL語句將執(zhí)行全表掃描,性能極差。MyISAM引擎中的全文索引是專門對文本創(chuàng)建索引的,但對中文的支持不好。好的解決方案:使用sphinx

!Sphinx

?Sphinx是一個獨(dú)立的全文索引引擎,意圖為其他應(yīng)用提供高速、低空間占用、搜索結(jié)果高相關(guān)度的全文搜索功能。Sphinx可以非常容易的與SQL數(shù)據(jù)庫和

語言集成。內(nèi)置MySQL和PostgreSQL數(shù)據(jù)庫數(shù)據(jù)源的支持。搜索API支持PHP、Python、Perl、Rudy和Java。sphinx

的特性高速的建立索引(可達(dá)10M/秒)高性能的搜索(平均檢索時間小于0.1秒)可處理海量數(shù)據(jù)提供了優(yōu)秀的相關(guān)度算法支持分布式搜索提供

生成功能可作為MYSQL

引擎提供搜索服務(wù)支持布爾、短語、詞語相似度等多種檢索模式單個文檔支持多個全文檢索字段(最大不超過32個)支持額外的屬性信息支持單一字節(jié)編碼和UTF-8編碼原生支持MYSQL、PostgreSQL數(shù)據(jù)庫sphinx

的特性Sphinx單一索引最大可包含1億條記錄,在1千萬條記錄情況下的查詢速度為0.x秒(毫秒級)。Sphinx創(chuàng)建索引的速度為:創(chuàng)建100萬條記錄的索引只需3~4分鐘,創(chuàng)建1000萬條記錄的索引可以在50分鐘內(nèi)完成,而只包含

10萬條記錄的增量索引,重建一次只需幾十秒。sphinx

支持的操作系統(tǒng)Linux

2.4.x,

2.6.x

(包括各種

版)Windows

2000,

XPFreeBSD

4.x,

5.x,

6.xNetBSD

1.6,

3.0Solaris

9,

11Mac

OS

XSphinx的Windows版可用于測試和調(diào)試,但不建議用于生產(chǎn)系統(tǒng)。最突出的兩個問題是:缺少并發(fā)查詢的支持;缺少索引數(shù)據(jù)熱切換的支持。coreseek

?Coreseek是一款中文全文檢索/搜索

,基于Sphinx研發(fā)并獨(dú)立發(fā)布,專攻中文搜索和信息處理領(lǐng)域,適用于行業(yè)/垂直搜索、

/站內(nèi)搜索、數(shù)據(jù)庫搜索、文檔/文獻(xiàn)檢索、信息檢索、數(shù)據(jù)挖掘等應(yīng)用場景使用PHP客戶端查詢

Sphinx

的基本原理與檢索流程如何獲得sphinx從官網(wǎng),支持中文分詞的可以:從

http:

Sphinx

的壓縮包中包含以下indexer

:用來創(chuàng)建索引search

:一個命令行的測試程序searchd:

服務(wù)器端一些客戶端api

庫,包含php,python,perl,ruby等。sphinx

的配置文件:sphinx.confSphinx

中的基本概念數(shù)據(jù)源索引的數(shù)據(jù)可以來自不同的來源:SQL數(shù)據(jù)庫、純文本、HTML文本、郵件等。限制:每一個文檔必須有一個ID,并且類型必須為唯一的、非零非負(fù)的整數(shù)。定義數(shù)據(jù)源sphinx.conf

配置文件中定義數(shù)據(jù)源source

名字

{...}index

索引

{...}在配置文件中可以定義多個數(shù)據(jù)源,每個數(shù)據(jù)源都有一個index項(xiàng)對應(yīng)。對應(yīng)方法:在定義index時有一項(xiàng)source

指定使用的數(shù)據(jù)源,如:source

songs{...}index

songsindex{source

=

songs}如何寫配置文件sphinx.conf

配置文件中需要定義以下內(nèi)容source{}定義數(shù)據(jù)源,可以定義多個,每一個數(shù)據(jù)源對應(yīng)一個indexindex{}定義索引,每個索引對應(yīng)一個數(shù)據(jù)源indexer{}配置indexer進(jìn)程,只能有一個searchd{}配置searchd服務(wù)器進(jìn)程,只能有一個定義數(shù)據(jù)源定義數(shù)據(jù)源為songs表中的title,author,content字段source

mysql{typesql_hostsql_usersql_passsql_dbsql_portsql_query_presql_query=

mysql=

localhost=

root==

test=

3306=

SET

NAMES

utf8=

SELECT

id,title,author,content

FROM

songs}sql_query_pre:預(yù)查詢SQL語句,通常用來設(shè)置編碼sql_query:主查詢,其中第一個字段必須是id并且類型為非負(fù)、非空、唯一的整數(shù)Sphinx

中的基本概念分區(qū)查詢通常sphinx在建索引時,是通過主查詢把數(shù)據(jù)

讀到內(nèi)存操作,但這可能導(dǎo)致在這個過程中整個表被鎖定阻塞其他連接的操作,同時,會占用大量的內(nèi)存。分區(qū)查詢可以把數(shù)據(jù)分成若干份,分批處理。配置如下:sphinx.conf

文件中先取得最大值和最小值sql_query_range

=

SELECT

MIN(id),MAX(id)

FROM設(shè)置每次

的記錄數(shù)sql_range_step

=

10003.設(shè)置主查詢sql_query

=

SELECT

id,title

FROMWHERE

id

>=

$start

AND

id

<=

$end定義索引每個數(shù)據(jù)源對應(yīng)一個索引index

mysql{sourcepathdocinfo=mysql

-->對應(yīng)數(shù)據(jù)源的名字=D:/coreseek/tt/mysql

--》索引存放路徑=extern

--》屬性信息存放位置charset_dictpath

=D:/coreseek/etc/

-->分詞庫charset_type

=

.utf-8

-->編碼只支持utf8和sbcs(單字節(jié))}配置indexer程序indexer{mem_limitmax_iopsmax_iosize}=128M

-->建索引時使用的內(nèi)存量=0

-->每秒最大i/o操作次數(shù),0為=

0

-->

最大允許的i/o操作大小,0

,單位字節(jié)配置服務(wù)器端searchd{listenread_timeoutmax_childrenmax_matchesseamless_rotatepreopen_indexesunlink_old=9312

--》端=5

--》查詢超時時間=30

--》并發(fā)搜索數(shù),0為不限制=1000

-->最多匹配的記錄數(shù)=0

-->是否啟動無縫切換索引=0

--》是否在服務(wù)器啟動時,打開所有索引=1--》索引切換后是否刪除舊的索引文件log =

D:/coreseek/tt/searchd_mysql.logquery_log =

D:/coreseek/tt/query_mysql.log}sphinx

創(chuàng)建索引indexer

創(chuàng)建索引indexer-c

配置文件索引名稱(--all代表所有索引)如:根據(jù)配置文件創(chuàng)建所有索引indexer

-c

C:/sphinx.conf

--all根據(jù)配置文件創(chuàng)建叫做song的索引indexer

-c

C:/sphinx.con

gsSphinx

創(chuàng)建索引SQL數(shù)據(jù)源創(chuàng)建索引的流程連接到數(shù)據(jù)庫執(zhí)行預(yù)查詢

(sql_query_pre

,通常用來設(shè)置編碼)執(zhí)行主查詢(sql_query,主要用來取要建索引的數(shù)據(jù))執(zhí)行后查詢

(sql_query_post)關(guān)閉到數(shù)據(jù)庫的連接對數(shù)據(jù)分詞、排序創(chuàng)建索引文件再次建立到數(shù)據(jù)庫的連接執(zhí)行后索引查詢

(sql_query_post_index)再次關(guān)閉到數(shù)據(jù)庫的連接使用

search

進(jìn)試search

:

s

中對索引進(jìn)search-c

配置文件查詢的詞試如:search-c

D:/sphinx.conf

冬天sphinx

開啟服務(wù)器searchd開啟服務(wù)端searchd-c

配置文件索引名稱服務(wù)器端默認(rèn)

9312

端口。常用命令:-c:指定配置文件路徑--stop:停止當(dāng)前服務(wù)--status

:查看當(dāng)前狀態(tài)--install:安裝為

windows

服務(wù)--delete:刪除windows服務(wù)--port

port:

的端口--index indexName:只查詢某個索引,默認(rèn)查詢所有索引使用PHP

API操作

Sphinx使用php

api在sphinx的解壓

下有個apiphp,python,perl,java等sphinxapi.php

到<?phprequire('sphinxapi.php');$sc

=

new

SphinxClient();里面包含了客戶端的API,包括下,代碼示例://包含PHP驅(qū)動文件//生成客戶端//設(shè)置服務(wù)器$sc->setServer('localhost',

9312);$res=$sc->query('

','mysql2');

//在mysql2索引中查詢匹配模式SPH_MATCH_ALL

:匹配所有查詢詞(默認(rèn))SPH_MATCH_ANY:匹配查詢詞中的任意一個。SPH_MATCH_PHRASE:將整個查詢詞看做一個詞組,要完全匹配SPH_MATCH_BOOLEAN:將查詢看作一個布爾表達(dá)式SPH_MATCH_EXTENDED:查詢看做一個sphinx的表達(dá)式PHP中通過setMat

ode函數(shù)來設(shè)置,如:<?php$sc

=

new

SphinxClient();$sc->setMat

ode(SPH_MATCH_ANY);布爾查詢SPH_MATCH_ALL

完全匹配所有的詞如“冬天的但可以匹配“雪”,并不會匹配“我愛冬天”,朋友,愛冬天,和雪”。因?yàn)椤岸斓难北环殖伞岸臁?,“的”,“雪”三個詞,匹配條件是同時包含這三個詞,“我愛冬天”里只包含一個“冬天”布爾查詢SPH_MATCH_ANY:匹配任意一個詞如“冬天

雪”,并會匹配

“我愛冬天”。"冬天的雪“-》”冬天“”的“”雪“因?yàn)椤拔覑鄱臁崩镉幸粋€“冬天”相匹配。布爾查詢SPH_MATCH_PHRASE:必須匹配整個短語如“冬天的雪”,不會匹配

朋友,愛冬天,和雪”,雖然都包含同樣的需要嚴(yán)格匹配不再健忘,只匹配“冬天的雪”布爾查詢SPH_MATCH_EXTENDED:

支持一些擴(kuò)展的語法支持@字段查詢?nèi)?,查詢title包含

abc,content

包含

bcd的:'@title

abc

@content

bcd'布爾查詢SPH_MATCH_BOOLEAN

與,或,組&,or,!,()查詢“如:

o

|world”,或“冬天”,:<?php$sc

=

new

SphinxClient();$res=$sc->query("

|冬天");常用API。buildExcerpts:創(chuàng)建文檔close:關(guān)閉連接query:執(zhí)行查詢getLastError:返回上一條錯誤信息open:建立到服務(wù)器端的持久連接setArrayResult:設(shè)置返回結(jié)果格式setLimits:設(shè)置返回結(jié)果數(shù)量與偏移setMat odel:設(shè)置查詢模式updateAttributes:更新文檔屬性setGroupBy

:設(shè)置分組屬性setFilter

:設(shè)置過濾器API查看:為查詢結(jié)果生成buildExcerpts

(

array

$docs

,

string

$index

,

string

$words

[,

array$opts

]

)Sphinx

中的基本概念索引合并indexer--merge

desc src[--rotate]例。把delta

索引合并到main

索引上indexer--merge

main

delta--rotate--rotate項(xiàng)是可選的,如果searchd服務(wù)器已經(jīng)啟動,則必須要加。Sphinx

中的基本概念屬性屬性是附加在每個文檔上的額外的信息??梢栽谒阉鲿r用于過濾和排序。如:把搜索出來的數(shù)據(jù)根據(jù)時間屬性排序。屬性支持的類型:無符號整數(shù)UNIX時間戳浮點(diǎn)值字符串(

sql_attr_uint)(

sql_attr_timestamp

)(

sql_attr_float

)( sql_attr_str2ordinal

)多值屬性

MVA (

sql_attr_multi

)實(shí)時索引更新有這么一種常見的情況:整個數(shù)據(jù)集非常大,以至于難于經(jīng)常性的重建索引,但是每次新增的記錄卻相當(dāng)?shù)厣?。一個典型的例子是:一個

有1000000個已經(jīng)歸檔的帖子,但每天只有1000個新帖子。如果為這1000條記錄重建所有索引將花費(fèi)很長時間。解決的辦法是:“主索引+增量索引”模式來實(shí)現(xiàn)“近實(shí)時”的索引更新。實(shí)現(xiàn)思路:把數(shù)據(jù)分成兩部分分別索引建立初始數(shù)據(jù)主索引定期創(chuàng)建增量部分的索引,并把增量的索引合并到主索引上。主索引

+增量索引的實(shí)現(xiàn)第一步:創(chuàng)建一張表用來記錄已經(jīng)索引的記錄條數(shù)create

table

a{id

int

unsigned

not

null,max_id

int

unsigned

not

null

default

'0',primary

key

(id)}主索

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論