Crius
(Crius)
3월 13, 2023, 5:27오후
1
대부분의 사용 사례에서는 일반 검색으로 충분할 수 있다는 점은 이해합니다. 하지만 일부 사용자들로부터 검색 시 결과를 필터링할 수 있는 기능이 필요하다는 요청을 받았습니다. 예를 들어, 응답만 표시하거나 주제만 표시하는 기능(주제에 대한 첫 번째 응답으로 해석될 것 같습니다)이 그것입니다.
이 기능은 테마 컴포넌트로도 구현할 수 있을 것 같지만, 제가 뭘 놓치고 있는 건 아닌지 먼저 여쭤보고 싶었습니다.
감사합니다.
1개의 좋아요
isaac
(Isaac Janzen)
3월 13, 2023, 5:53오후
2
현재 모든 토픽과 게시물 을 검색할 수 있습니다.
토픽 제목 의 검색 결과는 제외하고 이 기능을 사용하길 원하시는 건가요?
1개의 좋아요
Heliosurge
(Dan DeMontmorency)
3월 13, 2023, 6:28오후
3
필터링을 위한 고급 검색 기능을 확인해 보셨나요?
Crius
(Crius)
3월 13, 2023, 7:44오후
4
토픽과 게시물에서 검색이 가능하다는 것은 알고 있습니다. 보고되는 문제는 검색 결과에 토픽과 게시물이 섞여 있다는 것이며, 현재처럼 둘 다 표시하는 것 외에도 “토픽만” 또는 “게시물만” 표시하도록 Discourse에 지시할 수 있는 방법이 있으면 좋겠다는 것입니다.
검색 결과가 무한 스크롤 인터페이스로 표시되므로, 사용자가 이미 알고 있는 내용(즉, 검색 결과에 없는 항목)을 필터링할 수 있다면 노이즈를 줄일 수 있습니다.
특정 게시물을 찾고 있다는 것을 알고 있다면, 원하는 것을 찾기 위해 토픽까지 계속 스크롤할 이유는 없습니다.
이제 명확해졌기를 바랍니다.
1개의 좋아요
Canapin
(Coin-coin le Canapin)
3월 13, 2023, 8:54오후
5
Discourse에서 “topic”(토픽)은 모든 메시지를 의미합니다. 첫 번째 게시물은 원본 게시물(OP) 또는 첫 번째 게시물이라고 합니다.
그러나 버튼 을 클릭하면 처음에는 1개의 게시물로 구성된 토픽이 생성되고, 답글이 쌓이면 게시물이 더 추가되므로 혼동될 수 있다는 점은 이해합니다.
이 점을 고려할 때,
Crius:
only the topics
은 "토픽의 첫 번째 게시물만"을 의미하며, 실제로 이 기능은 in:first 필터를 통해 사용할 수 있습니다:
첫 번째 게시물을 제외한 모든 게시물에서 검색하는 것은 불가능하며, 현재 용어, 필터, 카테고리 또는 기타 요소를 제외하는 연산자가 없습니다.
2개의 좋아요
Crius
(Crius)
3월 13, 2023, 10:51오후
6
@Canapin님의 통찰력에 감사합니다.
기본적으로 토픽만 반환한다는 명세에 대해 감사드립니다. 그 부분을 완전히 놓치고 있었네요
대안으로, 검색 결과가 실제 결과를 반환할 때 URL을 구성하는데, URL 형식이 게시물을 지정하는 항목에는 단순히 style="display:none"을 추가하고, 반대로 토픽에는 반대 처리를 하는 컴포넌트/플러그인을 만들 수 있을까요?
플러그인인 경우, 검색 결과 어딘가에 “이것은 첫 번째 답변입니다” 또는 "이것은 첫 번째 답변이 아닙니다"를 결정하는 함수가 있을 것입니다. 특정하게 추가된 새로운 필터를 기준으로 해당 결과를 배열에 추가하는 것을 차단하고 건너뛸 수 있을지도 모르겠습니다.
해당 컨트롤러/모델이 포함된 파일이 무엇인지 아신다면, 여기서 링크를 공유해 주시겠어요? 저도 한번 확인해 보고 싶습니다.
1개의 좋아요
Canapin
(Coin-coin le Canapin)
3월 13, 2023, 11:40오후
7
나에게는 낯설고 신비롭고 무서운 세계이지만, 코드를 살펴보면 컨트롤러는 여기 있습니다:
# frozen_string_literal: true
class SearchController < ApplicationController
before_action :cancel_overloaded_search, only: [:query]
skip_before_action :check_xhr, only: :show
after_action :add_noindex_header
def self.valid_context_types
%w[user topic category private_messages tag]
end
def show
permitted_params = params.permit(:q, :page)
@search_term = permitted_params[:q]
# a q param has been given but it's not in the correct format
# eg: ?q[foo]=bar
raise Discourse::InvalidParameters.new(:q) if params[:q].present? && !@search_term.present?
if @search_term.present? && @search_term.length < SiteSetting.min_search_term_length
This file has been truncated. show original
검색 필터는 여기 있는 것 같습니다:
end
def self.custom_topic_eager_load(tables = nil, &block)
(@custom_topic_eager_loads ||= []) << (tables || block)
end
def self.custom_topic_eager_loads
Array.wrap(@custom_topic_eager_loads)
end
advanced_filter(/\Ain:personal-direct\z/i) do |posts|
if @guardian.user
posts.joins("LEFT JOIN topic_allowed_groups tg ON posts.topic_id = tg.topic_id").where(
<<~SQL,
tg.id IS NULL
AND posts.topic_id IN (
SELECT tau.topic_id
FROM topic_allowed_users tau
JOIN topic_allowed_users tau2
ON tau2.topic_id = tau.topic_id
AND tau2.id != tau.id
그리고 Discourse Assign 이 검색에 필터를 추가하는 방식을 살펴보는 것도 흥미로울 것입니다:
end
register_search_advanced_filter(/in:assigned/) do |posts|
posts.where(<<~SQL) if @guardian.can_assign?
topics.id IN (
SELECT a.topic_id FROM assignments a WHERE a.active
)
SQL
end
register_search_advanced_filter(/in:unassigned/) do |posts|
posts.where(<<~SQL) if @guardian.can_assign?
topics.id NOT IN (
SELECT a.topic_id FROM assignments a WHERE a.active
)
SQL
end
register_search_advanced_filter(/assigned:(.+)$/) do |posts, match|
if @guardian.can_assign?
if user_id = User.find_by_username(match)&.id
2개의 좋아요
Crius
(Crius)
3월 14, 2023, 1:47오후
8
@Canapin 감사합니다. 요즘 일이 정말 바빠서, 조금 여유가 생겼을 때 어떤 작업을 할 수 있을지 정보를 모으고 있어요. 몇 주 후에 다시 확인해볼게요
1개의 좋아요