2012-03-22 2 views
0

표준 EXTENDED2/SPH_RANK_PROXIMITY_BM25 방식을 사용하여 중간 크기의 제품 데이터베이스 (10mm 레코드, 2GB)에서 sphinx를 실행하고 있습니다. 속도가 빠르며, 관련성이 높습니다.일부/일부 일치를위한 스핑크스 튜닝

그러나 우리는 데이터베이스보다 복잡한 용어로 검색하는 최종 사용자의 불만이 늘어나고있어 결과가 없습니다.

예를 들어, 우리는 일반적인 검색 동안 "KitchenAid 장인 5 쿼트 믹서는"이을 "KitchenAid 장인 5 쿼트 갈색 믹서 스탠드"제품이있다. 우리가 가지고있는 물건을 돌려 줄 수있을 때 우리가 현재 세팅 한 결과는 일치하지 않습니다.

우리는 @weight 모드로 MATCH_ANY 정렬을 시도했지만, 스핑크스가 개별 단어로 다른 제품을 픽업 할 때 관련성이 완전히 옆으로 간다 [인형 및 보드 게임이 떠올랐다 고 생각한다].

근접 및 단어 밀도에서 순위를 매기면서 더 많은 공개 매칭을 허용하는 쿼리 매개 변수를 작성하는 모범 사례가 있습니까? 즉 쿼럼입니다 탐험

$cl = new SphinxClient(); 
$cl->SetServer('1.23.4', 456); 
$cl->SetMaxQueryTime(15000); 
$cl->SetMatchMode(SPH_MATCH_EXTENDED2); 
$cl->SetRankingMode(SPH_RANK_PROXIMITY_BM25); 
$cl->SetArrayResult(true); 
$cl->SetFilter('active', array(1)); 
$cl->SetSortMode(SPH_SORT_RELEVANCE, '@weight DESC, priced ASC'); 
$cl->SetLimits(intval($try), 1, 20, 500); 
$cl->SetFieldWeights(array('ptitle' => 60, 'description' => 40)); 
$res = $cl->query($searchterm,"products"); 

답변

2

한 가지를 도움이된다면

여기에 현재 PHP API 명령입니다. 특정 키워드 수가 필요할 수 있으므로 긴 검색어에 유용 할 수 있습니다. ANY는 한 단어 만 일치 시키지만 정족수는 7 개 중 4 개를 말하도록 요구할 수 있습니다.

이렇게하면 여러 가지 정말로 나쁜 성냥을 배제 할 수 있습니다.

쿼럼은 확장 된 일치 모드의 일부로 구문이므로 다른 모든 순위 모드를 시도 할 수 있습니다. SPH_RANK_MATCHANY를 사용하면 여전히 시도 할 수 있습니다. '부분적인'부분 일치가 적당해야합니다. 그러나 다른 모드를 사용해 볼 수도 있습니다.

형태학을 사용하는 경우 index_exact_words를 활성화하고 순위를 올릴 수도 있습니다.

그래서

//this works as long as the user is not using special syntax, but if using -="() etc, need to be more clever 
$bits = preg_split('/\s+/',trim($searchterm)); 
$quorum = ceil(count($bits)*0.66); 
$searchterm2 = '='.implode(' =',$bits); 

$searchterm = '"'.$searchterm.'"/'.$quorum.' | "'.$searchterm2.'"/'.$quorum; 

또한, 나는 당신의 setLimits에 대한 의심이 ... 같은 일을 할 것입니다. 20의 max_matches는 매우 낮게 보입니다. 그리고 컷오프는 불필요 해 보인다. 그것은 당신의 문제를 일으킬 수도 있습니다. 500 개의 합리적인 문서를 찾은 다음 나중에 데이터 세트에서 더 나은 일치가 있더라도 검색을 중단합니다.

+0

쿼럼과 코드가 정확히 충분히 자유롭게 정리해야합니다. 또한이 작업을 수행하는 사람들에게 근접성이 실제로 도움이되므로 EXTENDED2 경기를 고수했습니다. 또한 컷오프가 제거되어 사용자의 입장에서 도움이되었을 수 있습니다. –

+0

참고 : 제공된 코드에 약간의 버그가 있습니다. "첫 번째. $ 쿼럼 이후". 문제가있는 사람은 모두 비트를 제거해야합니다. –

+1

Opps! 수정 된 답변을 수정했습니다. – barryhunter