Class: ElasticRecord::Lucene

Inherits:
Object
  • Object
show all
Defined in:
lib/elastic_record/lucene.rb

Constant Summary collapse

ESCAPE_REGEX =

Special characters: + - && || ! ( ) { } [ ] ^ “ ~ * ? : \

/(\+|-|&&|\|\||!|\(|\)|{|}|\[|\]|`|"|~|\?|:|\\)/

Class Method Summary collapse

Class Method Details

.escape(query) ⇒ Object



10
11
12
# File 'lib/elastic_record/lucene.rb', line 10

def escape(query)
  query.gsub(ESCAPE_REGEX, "\\\\\\1")
end

.match_word(word, fields) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/elastic_record/lucene.rb', line 29

def match_word(word, fields)
  word = escape(word)
  if word =~ / /
    word = "\"#{word}\""
  else
    word = "#{word}*"
  end

  or_query = fields.map { |field| "#{field}:#{word}" }.join(' OR ')

  "(#{or_query})"
end

.smart_query(query, fields) ⇒ Object

Returns a lucene query that works like G



15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/elastic_record/lucene.rb', line 15

def smart_query(query, fields)
  return if query.blank?

  words = Shellwords::shellwords(query)

  words.map do |word|
    if word =~ /^(\w+):(.+)$/ && fields.include?($1)
      match_word $2, [$1]
    else
      match_word word, fields
    end
  end.join(' AND ')
end