Class: Droonga::Searcher::QuerySearcher

Inherits:
Object
  • Object
show all
Includes:
Loggable
Defined in:
lib/droonga/searcher.rb,
lib/droonga/searcher/mecab_filter.rb

Defined Under Namespace

Classes: MeCabTokenizer

Constant Summary collapse

OPERATOR_CONVERSION_TABLE =
{
  "||" => Groonga::Operator::OR,
  "&&" => Groonga::Operator::AND,
  "-"  => Groonga::Operator::AND_NOT,
}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(search_request) ⇒ QuerySearcher

Returns a new instance of QuerySearcher.



231
232
233
234
# File 'lib/droonga/searcher.rb', line 231

def initialize(search_request)
  @result = SearchResult.new
  @request = search_request
end

Class Method Details

.search(search_request) ⇒ Object



226
227
228
# File 'lib/droonga/searcher.rb', line 226

def search(search_request)
  new(search_request).search
end

Instance Method Details

#apply_condition!(condition) ⇒ Object



370
371
372
373
374
375
376
377
378
379
# File 'lib/droonga/searcher.rb', line 370

def apply_condition!(condition)
  expression = Groonga::Expression.new(context: @request.context)
  expression.define_variable(:domain => @records)
  parse_condition(@records, expression, condition)
  logger.trace("search_query: select: start",
               :condition => condition)
  @records = @records.select(expression)
  logger.trace("search_query: select: done")
  @result.condition = expression
end

#apply_mecab_filter(condition) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/droonga/searcher/mecab_filter.rb', line 36

def apply_mecab_filter(condition)
  return unless condition.is_a?(Hash)
  return unless condition["useMeCabFilter"]
  query = condition["query"]
  return if query.nil?
  match_columns = condition["matchTo"]
  return unless match_columns.is_a?(Array)
  return if match_columns.size != 1
  match_column = match_columns.first

  tokenizer = MeCabTokenizer.new

  @records.open_cursor do |cursor|
    count = 0
    cursor.each do |record|
      match_target = record[match_column]
      body_terms = tokenizer.tokenize(match_target)
      unless body_terms.include?(query)
        record.delete
      end
    end
  end
end

#original_apply_condition!Object



60
61
62
63
64
65
66
67
68
69
# File 'lib/droonga/searcher/mecab_filter.rb', line 60

def apply_condition!(condition)
  expression = Groonga::Expression.new(context: @request.context)
  expression.define_variable(:domain => @records)
  parse_condition(@records, expression, condition)
  logger.trace("search_query: select: start",
               :condition => condition)
  @records = @records.select(expression)
  logger.trace("search_query: select: done")
  @result.condition = expression
end

#searchObject



236
237
238
239
# File 'lib/droonga/searcher.rb', line 236

def search
  search_query!
  @result
end