optimize query

pull/493/head
Pete Matsyburka 5 months ago
parent c0594a8b74
commit b3baea2f6f

@ -5,10 +5,6 @@ module SearchEntries
UUID_REGEXP = /\A[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\z/i
FIELD_SEARCH_QUERY_SQL = <<~SQL.squish
tsvector @@ (quote_literal(coalesce((ts_lexize('english_stem', :keyword))[1], :keyword)) || ':*' || :weight)::tsquery
SQL
module_function
def reindex_all
@ -83,21 +79,38 @@ module SearchEntries
end
def build_weights_tsquery(terms, weight)
last_query = Arel.sql(<<~SQL.squish)
last_query =
if terms.last.length <= 2
Arel.sql("ngram @@ (quote_literal(:term#{terms.size - 1}) || ':' || :weight)::tsquery")
else
Arel.sql(<<~SQL.squish)
(quote_literal(coalesce((ts_lexize('english_stem', :term#{terms.size - 1}))[1], :term#{terms.size - 1})) || ':*' || :weight)::tsquery
SQL
end
query = terms[..-2].reduce(last_query) do |acc, term|
query = terms[..-2].reduce(nil) do |acc, term|
index = terms.index(term)
arel = Arel.sql(<<~SQL.squish)
(quote_literal(coalesce((ts_lexize('english_stem', :term#{index}))[1], :term#{index})) || ':' || :weight)::tsquery
SQL
Arel::Nodes::InfixOperation.new('&&', arel, acc)
acc ? Arel::Nodes::InfixOperation.new('&&', arel, acc) : arel
end
query =
if terms.last.length <= 2
query = Arel::Nodes::InfixOperation.new('@@', Arel.sql('tsvector'), query)
Arel::Nodes::And.new([query, last_query])
else
Arel::Nodes::InfixOperation.new(
'@@', Arel.sql('tsvector'),
Arel::Nodes::Grouping.new(Arel::Nodes::InfixOperation.new('&&', query, last_query))
)
end
["tsvector @@ (#{query.to_sql})", terms.index_by.with_index { |_, index| :"term#{index}" }.merge(weight:)]
[query.to_sql, terms.index_by.with_index { |_, index| :"term#{index}" }.merge(weight:)]
end
def build_weights_wildcard_tsquery(keyword, weight)

Loading…
Cancel
Save