중국어 검색 발췌문이 깨져 보입니다

포럼에서 중국어를 검색하려고 하면 검색 결과에서 문장이 깨져서 표시됩니다. 구두점이 누락되고 단어 사이에 예상치 못한 공백이 있으며 일부 단어는 완전히 빠져 있습니다.

예를 들어 管理员를 검색했을 때, 원래 문장은 다음과 같습니다.

管理人员可见的分类。只有管理员和版主才能阅览主题

하지만 검색 결과에서 보이는 내용은 다음과 같습니다.

보시다시피, 可见的가 누락되었고, 마침표 。도 빠져 있어 문장이 끊겨 있습니다. 또한 只有, 和, 才能도 누락되어 있습니다. 그리고 중간에 예상치 못한 공백이 존재합니다.

이 문제를 해결하는 데 도움을 주실 수 있는 분이 있을까요? 감사합니다.

2개의 좋아요

그 부재한 문자들이 중국어에서 정지 단어(stop word)로 취급되는 것 같습니다.

(byebug) data = CppjiebaRb.segment(search_data, mode: mode)
["管理人员", "可见", "的", "分类", "。", "只有", "管理员", "和", "版主", "才能", "阅览", "主题"]
(byebug) CppjiebaRb.filter_stop_word(data)
["管理人员", "分类", "管理员", "版主", "阅览", "主题"]
3개의 좋아요

잠깐, 여기서 버그가 결과의 "summary"가 이상해 보이는 거예요? 검색 기능 자체에 실제 문제가 있는 건 아니라는 거죠?

네, 검색은 여전히 잘 작동하지만, 표시되는 발췌문이 이상적이지는 않습니다. 중국어의 경우 검색 처리 방식이 다소 다릅니다. 검색 쿼리 자체에서 정지어를 무시하는 대신, 검색 데이터에서 완전히 제외합니다.

3개의 좋아요

확인해 주셔서 감사합니다.

이것은 중국어에서 정지어가 아니라 형용사로, '보이는(visible)'이라는 뜻입니다.

이 문제를 수정할 수 있을까요? (검색 결과에 포함된 모든 항목 포함) 아니면 우회 방법이 있을까요?

감사합니다.

1개의 좋아요

Stop words란 매우 일반적으로 사용되어 검색 성능을 저하시키는 단어들을 의미합니다.

예를 들어 영어의 "and"는 stop word입니다.

이 문제를 수정할 수 있으며, 몇 개월이 걸릴 것으로 보입니다. 그 사이 긴급한 수정이 필요하시다면 #marketplace를 이용해 주세요.

#pr-welcome으로 표시합니다.

2개의 좋아요

정지어는 GitHub - yanyiwu/cppjieba: "结巴"中文分词的C++版本 · GitHub 을 사용하여 결정됩니다. 검색 발췌문 표시 방식이 최근 변경되었으므로, 실제 검색 데이터에 영향을 주기 때문에 다음 줄을 제거하는 것이 좋습니다.

어쨌든 우리의 중국어 검색 지원은 훌륭하지 않지만, 네이티브 지원이 없는 언어를 적절하게 지원할 수 있도록 고려해 볼 수 있는 PG 확장 기능이 있습니다. 예를 들어 https://pgroonga.github.io/ ?

5개의 좋아요

감사합니다! 한번 시도해 보고 결과를 확인해 보겠습니다.

@tgxworld 제가 제대로 이해하고 있는지 모르겠는데, pgroonga는 중국어와 일본어를 지원하지 않는 것 같습니다. https://pgroonga.github.io/ 에 따르면,

PostgreSQL은 알파벳과 숫자만 사용하는 언어에 대한 전체 텍스트 검색을 지원합니다. 즉, PostgreSQL은 일본어, 중국어 등에 대한 전체 텍스트 검색을 지원하지 않습니다. PostgreSQL에 PGroonga를 설치하면 모든 언어에 대해 초고속 전체 텍스트 검색 기능을 사용할 수 있습니다!

@tgxworld 말씀하신 대로 PR을 생성했습니다. FIX: keep chinese stopwords on search - Pull Request #11530 - discourse/discourse - GitHub

의미는 정확히 반대입니다. 일반 PostgreSQL은 중국어와 일본어를 지원하지 않습니다. PGroonga는 이러한 언어에 대한 지원을 추가합니다.

3개의 좋아요

참고로 @riking 현재 Discourse가 PostgreSQL의 내장 함수를 사용하여 전체 텍스트 검색을 구현하고 있다는 것을 확인하고 싶어서요. discourse/lib/search.rb at 1cf057fb1c4e168ce441ddde918636725abeb668 · discourse/discourse · GitHub

이렇게 이해하는 것이 맞나요?

1개의 좋아요

처음에 더 구체적으로 말씀드리지 못한 점 죄송합니다. 지금 이 문제를 실제로 해결하려면, 검색 데이터에서는 중국어 스탑워드를 제거하지 않으면서도 검색 쿼리로 사용될 때는 스탑워드가 제거되도록 보장해야 합니다.

1개의 좋아요

@tgxworld 검색 데이터와 검색 쿼리의 차이를 이해하지 못하겠습니다. 좀 더 자세한 설명을 주실 수 있을까요? 감사합니다

인덱스에 스탑워드를 추가하면 인덱스가 부풀어 오르고 검색 성능이 저하됩니다.

PostSearchData 테이블에는 두 개의 컬럼이 저장되어 있습니다. #search_data는 검색어와 매칭할 때 사용되고, #raw_data는 검색 결과 발췌문을 표시할 때 사용됩니다. 여기서 수정해야 할 사항은 중국어 정지어가 #search_data에서는 제거되도록 유지하되, #raw_data에서는 제거되지 않도록 해야 한다는 것입니다.

이 버그에 대해 진행 상황은 어떻게 되나요?

여기서 몇 가지 변경 사항을 적용한 것 같습니다:

로케일이 zh_TW, zh_CN 또는 ja로 설정되어 있나요? 그렇지 않다면 search_tokenize_chinese_japanese_korean이 true로 설정되어 있나요?

여기 우회 처리(bypass)가 있습니다:

2개의 좋아요