2014-07-09 2 views
1

텍스트가 있다고 가정하십시오. Foo Bar Baz-Qux. Sphinx의 인덱서를 구성하여 어떻게 Sphinx가 주어진 문자열에 일치하는 것을 찾을 수 있습니까?가능한 단어로 공백을 처리하도록 Sphinx를 설정하십시오. 구분 기호

Foo Bar Baz-Qux 
Foo BazQux Bar 
Baz Qux Foo Bar 

은 현재 내가 ignore_chars 설정 값으로 대시 기호를했습니다, 그리고 스핑크스 날하지만 세 번째 처음 두 쿼리의 결과를 제공합니다.

솔루션은 일반적인 것이어야하며 예문이나 관련 순서에 따라 특정 단어에 의존하지 않아야합니다.

감사합니다.

답변

1

해결책 (또는 해결 방법)을 찾았습니다 : regexp_filter을 사용하십시오.

그래서 스핑크스 지수의 구성은 다음과 같이 지금 같습니다

... 
ignore_chars = - 
regexp_filter = \b([\w\d]+)-([\w\d]+)\b => \1\2 \1 \2 
... 

을 따라서 스핑크스는 인덱스에 텍스트를 넣어 바로 전에 두 가지 형태로 모든 대시 함유 단어를 분할합니다 : 첫 번째 대시 단순히 제거 하나를 두 번째로 대시가 공백으로 바뀌 었습니다. 색인 생성의 순간에 "Foo-Bar"라는 텍스트의 3 단어가 색인 생성됩니다 : "FooBar", "Foo"및 "Bar". "Foo-Bar"(대시는 ignore_chars 목록이므로 삭제 될 것입니다), "FooBar"(이 단어는 색인에 있음) 및 "Foo Bar"(두 단어는 모두 다음과 같은 검색어로 검색 할 수 있습니다. 색인에).

여기서 중요한 문제는 두 가지 유형의 쿼리에 대해 정확한 위상 일치를 동시에 사용할 수 없다는 것입니다. I. e. "Bar BazQux" 또는 "Bar Baz-Qux"을 검색하면 결과가 표시됩니다. 그러나 "Bar Baz Qux"에 대해서는 아무 것도 얻을 수 없습니다. 내 구체적인 경우에는 문제가 아니지만이 접근법을 사용하려는 모든 사람들을 위해 - 나는 당신에게 경고했습니다.

이 작업을 수행하는 더 좋은 방법을 알고 있거나 해결 방법에 제가 놓친 몇 가지 단점이 있다면 알려주십시오. here을 같이


또 다른 가능한 해결책은 트라이 그램의 사용. 이 방법은 가능한 사용자의 실수에도 도움이되지만 구현하기가 더 어렵습니다.

+0

좋은 해결책입니다. 너는 그것을 받아 들여야한다. –