2016-09-01 2 views
0

내 데이터베이스에서 정지 단어가 포함 된 게임 이름을 검색하는 데 문제가 있습니다. 나는 일반적으로 정확히 일치하는 것을 찾고있을 뿐이고, 가능한 한 모든 "검색", "최적의"검색을 위해 "퍼지"적중을 원합니다.PostgreSQL 전체 텍스트 검색 문제 (to_tsquery)

E.g. content that produced false positives directly, contains sentences like; "the war in Afghanistan" + reference to "win*" another place; or "Lifeseed to win the war"; or "win the war that is taking over the galaxy" and so on.

작동하지 않습니다 물론이 및 오류 준 : 그것은 내 다른 검색의 일부 (PostgreSQL의 9.6를) 해결로 나는 "phraseto_tsquery"woudl 작업을 기대했다

SELECT id, title, content FROM my_table 
WHERE [email protected]@ to_tsquery('win that war'); 

, 그러나 때문에에 그것을하지 않았다이 하나의 단어를 중지 : 나는 또한 타이 전투기 일을 사용하여 시도

SELECT id, title, content FROM my_table 
WHERE [email protected]@ phraseto_tsquery('win that war'); 

, < 1> | < ->하지만, 일반적으로는 잘못된 반응 가져옵니다

SELECT id, title, content FROM my_table 
WHERE [email protected]@ to_tsquery('win <-> that <-> war'); 

가 난 단지 가진 일치의 원하는 결과를 얻기 위해 여기에서 할 수있는 해킹가이 구문 검색입니다 반환 거기를? 나는 그걸 멈춤 단어로 제거 할 수 있을지도 모른다고 생각 했었습니다. 그 일을 어떻게하는지, 그리고 "월드 오브 워크래프트"와 비슷한 제목의 단어를 검색하는 데 얼마나 좋은 해결책인지 모르겠습니다. 일반적으로 정확한 일치 만 필요합니다).

생각하십니까?

답변

0

스톱 워드의 일부 또는 전체를 제거하려면 PostgreSQL 소프트웨어 디렉토리의 share/tsearch_data 하위 디렉토리에 축소 또는 빈 스톱 워드 파일을 만드십시오. 그런 다음 새 스톱 워드 파일을 사용하여

CREATE TEXT SEARCH DICTIONARY newdict (
    TEMPLATE = pg_catalog.snowball, 
    language = '...', 
    stopwords = '...' 
); 

으로 새 스노우 텍스트 검색 사전을 만들고이를 기반으로 새로운 텍스트 검색 구성을 만들 수 있습니다. 이것은 물론 색인을 더 크게 만듭니다. 당신이 인용의 예에서

, 차라리 다른 접근 방식을 선택하고 후보자를 줄이고 더 같은 두 번째 조건을 필터링하는 인덱스를 사용할 수 있도록 전체 텍스트 검색을 사용하십시오 :

SELECT id, title, content FROM my_table 
WHERE tsvector_combined @@ to_tsquery('win that war') 
    AND (title LIKE '%win that war%' OR content LIKE '%win that war%'); 
+0

나는 이것을 시도 할 것이다, 당신이 선호하는 옵션에 대한 나의 첫번째 관심사는 아마도 성능 일 것이다. 문제의 데이터베이스에는 수백만 개의 기사 항목이 포함되어 있으며 권장되는 솔루션이 변경됩니까? – user6776585

+0

아니요. 추가 WHERE 절이있는 쿼리는 PostgreSQL이 인덱싱 된 조건을 먼저 적용하고 결과를 처리하기 위해 'LIKE' 필터를 사용하므로 너무 비싸지 않아야합니다. 물론 전체 텍스트 검색이 많은 결과를 반환한다면 상황은 달라질 것이지만 두 방법 중 하나에 문제가있는 것입니다. –

관련 문제