2014-05-20 2 views
0

내 쿼리가 내가 필요한 결과를 가져 오지 못하는 이유에 대한 간단한 설명이 필요합니다. 여기첫 번째 문자로 스핑크스 일치

스핑크스 2.0.8-id64 릴리스 (r3831) 내가 sphinx.conf에있는 것입니다 :

SELECT 
trackid, 
title, 
artistname, 
SUBSTRING(REPLACE(TRIM(`artist_name`), 'the ', ''),1,3) AS artistname_init 
.... 

sql_field_string = title 
sql_field_string = artistname 
sql_field_string = artistname_init 

추가 설정 :

docinfo = extern 
charset_type = utf-8 
min_prefix_len = 1 
enable_star = 1 
expand_keywords= 0 
charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z, A..Z->a..z, a..z 

쿼리가 작동합니다. 내 데이터에 문제없이 색인을 생성합니다. 그러나 나는 스핑크스가 현명한 결과를 가져 오지 못하게하고 있습니다. 쿼리에 SphinxQL을 사용하고 있습니다.

예 :

select 
artistname, artistname_init from myindex 
WHERE MATCH('@artistname_init ^t*') 
GROUP BY artistname ORDER BY artistname_init ASC limit 0,10; 

쿼리에 관련된 아무것도 제공하지 않습니다. 나는 내가 좋아하는 생각할 수있는 모든 것을 시도했다 :

MATCH('@artistname_init ^t*') 
MATCH('@artistname_init[1] t') 
MATCH('@artistname_init ^t$') 

사람이 내 실수입니다 포인트 아마 나에게 내 경우에 작동 쿼리를 적어주세요 수 있습니까?

B (Single letter) 
B-T (Single letter + non-alphabet sign after) 
B as Blue (Single letter + space after) 
Baccara (First letter of single word) 
Bad Religion (First letter of several words) 
The B (not counting "The ") 
The B.Y.Z (Single letter + non-alphabet sign after not counting "The ") 
The B 2 B (Single letter + space after not counting "The ") 
The Boyzz (First letter of single word not counting "The ") 
The Blue Boy (First letter of several words not counting "The ") 

아니면 가까운 : 내 목표는이 정렬 순서를 따라야 결과를 얻을 수 있습니다.

+0

데이터베이스에'artistname' 컬럼과'artist_name' 컬럼이 실제로 있습니까? 아마도 그들은 서로 다른 정보를 포함하고 있을까요? 또한 min_prefix_len, min_infix_len, min_word_len, enable_star 및 dict 설정은 무엇입니까? – barryhunter

+0

소스 쿼리는 실제로 여러 개의 조인이며 실제로 크다. 나는이 사건에 대해 단순화 시켰고 필드 이름을 간과했다.주의해야 할 2 개의 필드는 아티스트 이름 및 artistname_init이며, 나머지는 내 사례와 관련이 없습니다. artistname에는 아티스트 이름이 있고 init 필드에는 "The"를 제거한 후 이름의 처음 3자를 포함합니다. 나는 요청 된 정보로 질문을 갱신 할 것이다. – Zhi

답변

0

당신이하려는 부분에는 움직이는 부분이 많이 있지만 제목 부분에는 적어도 대답 할 수 있습니다. Sphinx는 field-level ranking factors을 제공하여 WEIGHT() 함수를 사용자 정의 할 수 있습니다. 첫 번째 또는 두 번째 단어보다 나중에 쿼리와 일치하는 항목을 실제로 필터링하려고하는 것이 아니라 원하는대로 항목을 정렬하는 것이 훨씬 쉬워야합니다. 여기

은으로 분류 "B"로 시작하는 단어로 모든 결과를 반환합니다 예를 들어,의 그 단어가 표시되는 방법을 초기 :

SELECT id, artistname, WEIGHT() 
FROM myindex 
WHERE MATCH('(@artistname (b*))') 
ORDER BY WEIGHT() DESC 
LIMIT 10 
OPTION ranker=expr('sum(100 - min_hit_pos)'); 

당신은 몇 가지 즉 "와 같은 다른 경우를 필터링하려면 그런 다음 B ", 귀하의 응용 프로그램에서 그렇게하는 것이 좋습니다 것 같아요. 예를 들어 네 번째 결과에 세 번째 단어에 키워드가 있으면 첫 번째 3 개의 결과 만 반환합니다. 또는 실제로 스핑크스 에 새 필드를 만들고 앞에 "The"를 붙이지 말고 인덱스에 숫자 특성을 추가하여 단어가 제거되었음을 보여줍니다 (순위 식에서 숫자 특성을 사용할 수 있음).

"박쥐"보다 "B-t"순위가 높았는데 스핑크스의 알파벳 순서를 어떻게 든 변경하지 않고서는 가능하지 않은지 확실하지 않습니다. 소스 코드에 뛰어 들어보십시오. ;)


마지막으로 한 메모. 이 특정 종류의 쿼리의 경우, MySQL (실제로는 Sphinx 인덱스를 소싱하는 일반적인 방법이기 때문에 MySQL이라고 말함)은 실제로 올바르게 작동 할 수 있습니다. 선행 "The"를 없애면 B-tree 인덱스 (MySQL이 사용함)는 쿼리가 필드의 시작과 일치하는 결과 만 원한다고 확신하는 경우 완벽하게 검색하는 방법입니다. 스핑크스의 거꾸로 된 인덱스는 그런 종류의 과잉 공격입니다.