coreseek/sphinx中的匹配模式

所謂匹配模式就是用戶如何根據關鍵字在索引庫中查找相關的記錄。

SPH_MATCH_ALL, 匹配全部查詢分詞(默認模式);
如「手機配件」,不匹配 「我有一部手機」,但能夠匹配 「手機壞了,須要找配件」。
由於「手機配件」 被分紅 「手機」,「配件」兩個詞,匹配條件是必須同時包含這兩個詞,因此「我有一部手機」不符合匹配要求。

SPH_MATCH_ANY, 匹配查詢詞中的任意一個分詞;
如「手機配件」,會匹配「我有一部手機」,由於索引庫只要包含任一個分詞便可被搜到,固然也能匹配「手機壞了,須要找配件」。

SPH_MATCH_PHRASE, 將整個查詢看做一個詞組,要求按順序完整匹配;
這個與select * from [tab] where key like '%手機配件%'相相似,如「手機配件」,不匹配 「手機壞了,須要找配件」,但能夠匹配 「你這兒有手機配件嗎?」。

SPH_MATCH_BOOLEAN, 將查詢看做一個布爾表達式, 能夠簡單的與或非運算;
如( cat !dog ) | ( cat !mouse)
意思是搜索出全部匹配cat,但不匹配dog和mouse的查詢分詞。

SPH_MATCH_EXTENDED2,擴展匹配模式
將查詢看做一個Sphinx/Coreseek內部查詢語言的表達式。
在擴展查詢模式中可使用以下特殊操做符:

php

  • 或(OR)操做符:

hello | world

python

  • 非(NOT)操做符:

hello -world
hello !world

函數

  • 字段(field)搜索符:

@title hello @body world
#title 字段中包含hello body字段中包含world

spa

  • 字段限位修飾符

@body[50] hello
#body位數限制在50之內

code

  • 多字段搜索符:

@(title,body) hello world
#title 或 body字段中包含Hello world

索引

  • 全字段搜索符:

@* hello
#只要其中一列包含hello

文檔

  • 近似搜索符:

"hello world"~10
#hello world之間最多有10個詞


it

  • 閥值匹配符:

"the world is a wonderful place"/3
#至少匹配3個詞

擴展

  • 嚴格有序搜索符(即「在前」搜索符):

aaa << bbb << ccc
#aaa,bbb,ccc必須按前後順序出現
 select

  • 字段開始和字段結束脩飾符 

^hello  ...  world$
#限定必須以hello開頭,以world結尾 

 

如:"hello world" @title "example program"~10 @body python -(php|perl) @* code
要求同時匹配:
在文檔的任意字段中找相鄰的「hello」和「world」
文檔的title字段中還必須包含 「example」和「program」這兩個詞,而且他們之間至多有10個(不包括10個)其餘的詞
同時,body字段必須含有詞「python」,但既沒有「php」也沒有「perl」
任一字段中包含」code「

SPH_MATCH_EXTENDED, 同SPH_MATCH_EXTENDED2, 爲了兼容舊版本;

SPH_MATCH_FULLSCAN, 強制使用下文所述的「完整掃描」模式來對查詢進行匹配;

注意,在此模式下,全部的查詢詞都被忽略,儘管過濾器、過濾器範圍以及分組仍然起做用,但任何文本匹配都不會發生.

這裏不作文本匹配,即便你傳遞查詢詞也將被忽略,通常做爲過濾來用,好比說,我在餐廳索引中搜索北京的全部餐廳,我只要將北京地名的id用SetFilter方法來過濾便可。PHP中經過setMatchMode函數來設置,如:<?php$sc = new SphinxClient();$sc->setMatchMode(SPH_MATCH_ANY);

相關文章
相關標籤/搜索