2015-10-15 144 views
1

我正在使用Sphinx和Symfony2來掃描我的數據庫中的人。
奇怪的行爲是: 我搜索,吉姆,其結果是:
Sphinx搜索錯過成績

  • 詹姆斯 '吉姆' 歌手
  • 吉姆·亞伯拉罕
  • 吉姆·安德森
  • 吉姆·巴克斯
  • Jim Bennon
  • ...

如果我搜索吉姆·JA結果是:

  • 詹姆斯 '吉姆' 歌手
  • 吉姆·詹森
  • 佔渣木殊
  • ...

爲什麼我我錯過了「Ja」的結果,如果我只是搜索吉姆J,但我得到所有其他人?

這裏是源和索引碼:

source peopleautocomplete { 

sql_query   = SELECT id, firstName, lastName, pseudonym FROM Person 

sql_attr_string  = pseudonym 
sql_attr_string  = firstName 
sql_attr_string  = lastName 
} 

index peopleautocomplete 
{ 
source    = peopleautocomplete 
path    = /var/lib/sphinxsearch/data/peopleautocomplete 
docinfo    = extern 
charset_type  = utf-8 
min_word_len  = 2 
enable_star   = 1 
min_prefix_len  = 1 
} 

而且PHP代碼:

<?php 
    $q = $request->query->get('q'); 
    $aq = explode(' ', $q); 
    if (strlen($aq[count($aq) - 1]) < 2) { 
     $query = $q; 
    } else { 
     $query = $q . '*'; 
    } 
    $result = $this->_getSearchEngine()->searchEx($query, 'peopleautocomplete'); 
?> 

任何想法?

回答

0

爲什麼我錯過了「Ja」的結果,如果我只是搜索吉姆J,但我得到所有其他人?

搜索詞'Jim'和'J'都與Jim匹配。所以Jim Abrahams是有效的(它與兩個查詢詞相匹配)。其他人不是'失蹤',他們只是從底部掉下來,因爲很多比賽。

只需使用"Jim J"來搜索它們作爲短語(您的代碼應該添加所需的星星) - 將需要兩個匹配的單詞。

但是,這將不允許中間名。爲了允許這兩個選項 http://sphinxsearch.com/docs/current.html#extended-syntax

也許最簡單的是嚴格的命令操作符。

Jim << J

或者,如果要允許人們進入姓氏,其次是姓,可以只使用接近甚至NEAR


編輯:再次尋找,看到你的代碼不會真正正確添加星。它添加到每個空間分離的令牌,即使它本身是一個操作符。

<?php $query = preg_replace('/(\w{2,}\b)/','$1*',$query); 

更有效,更緊湊!

expand_keywords選項上的索引做到透明。