make-text-search 0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -45,14 +45,13 @@ The content added to the index can be filtered. Right now there are two filters:
45
45
 
46
46
  class Post < ActiveRecord::Base
47
47
  has_text_search :title, :filter => :substrings
48
- has_text_search :content, :intro :filter => [:strip_html, :substrings]
48
+ has_text_search :content, :intro, :filter => [:strip_html, :substrings]
49
49
  end
50
50
 
51
51
  You can use several filters using an array. The order is important. If you use both +:substrings+ and +:strip_html+, +:strip_html+ should be the first.
52
52
 
53
53
  +:substrings+ let you search inside the words. For example, the word +knowledge+ can be found with +owled+ if you filter the content with +:substrings+.
54
54
 
55
- +:strip_html+ elimina las etiquetas HTML y traduce las entities a su versión en UTF-8. Por ejemplo
56
55
  +:strip_html+ removes the HTML tags and it translates HTML entities to its equivalent in UTF-8:
57
56
 
58
57
  Ir a <a href="http://www.google.es">Google Espa&ntilde;a</a>
@@ -61,6 +60,35 @@ will be
61
60
 
62
61
  Ir a Google España
63
62
 
63
+ === Language
64
+
65
+ The documents can be parsed using a language. You can set the default language with +config.make_text_search.default_language+. The initial value is nil, which means that the documents are parsed in a agnostic way.
66
+
67
+ If you want to set the default language add this line to the +config/application.rb+ file.
68
+
69
+ config.make_text_search.default_language = "spanish"
70
+
71
+ If you want to have a different language for every record you have to implement the +text_search_language+ instance method. For example
72
+
73
+ class Post < ActiveRecord::Base
74
+ has_text_search :title, :filter => :substrings
75
+ has_text_search :content, :intro, :filter => [:strip_html, :substrings]
76
+
77
+ def text_search_language
78
+ case locale
79
+ when "es" "spanish"
80
+ when "en" "english"
81
+ when "de" "german"
82
+ when "it" "italian"
83
+ else
84
+ Rails.application.config.make_text_search.default_language
85
+ end
86
+ end
87
+ end
88
+
89
+ You can get the available languages of your PostgreSQL server with
90
+
91
+ select * from pg_ts_dict;
64
92
 
65
93
  == Search
66
94
 
@@ -71,6 +99,13 @@ To perform search you have to use the scope #search_text
71
99
 
72
100
  Post.published.search_text("foo & bar").paginate(:page => params[:page])
73
101
 
102
+ The query language is the same used by PostgreSQL. See http://www.postgresql.org/docs/8.4/static/datatype-textsearch.html#DATATYPE-TSQUERY
103
+
104
+ = Resources
105
+
106
+ * http://www.slideshare.net/billkarwin/full-text-search-in-postgresql
107
+ * http://www.sai.msu.su/~megera/postgres/fts/fts.pdf
108
+
74
109
  == TODO
75
110
 
76
111
  * Query builder. Add & and | operators
@@ -2,7 +2,6 @@ module MakeTextSearch
2
2
 
3
3
  ActiveSupport.on_load(:active_record) do
4
4
  require 'make-text-search/models'
5
- require 'make-text-search/query'
6
5
  require 'make-text-search/schema'
7
6
  require 'make-text-search/filters'
8
7
 
@@ -14,7 +13,7 @@ module MakeTextSearch
14
13
  class Railtie < ::Rails::Railtie
15
14
  config.make_text_search = ActiveSupport::OrderedOptions.new
16
15
  config.make_text_search.table_name = "text_search_documents"
17
- config.make_text_search.default_language = "english"
16
+ config.make_text_search.default_language = nil
18
17
 
19
18
  generators do
20
19
  load "generators/migration.rb"
@@ -38,15 +38,17 @@ module MakeTextSearch
38
38
  table_name = Rails.application.config.make_text_search.table_name
39
39
  record_type = quote record_class.name
40
40
  record_id = quote record.id
41
- language = quote record.text_search_language
41
+ language = record.text_search_language
42
42
 
43
- document = "to_tsvector(#{language}, #{quote record.text_search_build_document})"
43
+ # If language is nil the tsvector will be generated without language
44
+ document = "to_tsvector(#{language ? quote(language.to_s) + ", " : ""}#{quote record.text_search_build_document})"
44
45
 
46
+ # Reduce the number of operations in the index using SELECT+UPDATE instead of DELETE+INSERT
45
47
  if connection.select_value("SELECT count(*) FROM #{table_name} WHERE #{_where_record record}").to_i == 0
46
48
  connection.insert(%[INSERT INTO #{table_name}
47
49
  (record_type, record_id, language, document)
48
50
  VALUES
49
- (#{record_type}, #{record_id}, #{language}, #{document})])
51
+ (#{record_type}, #{record_id}, #{quote language}, #{document})])
50
52
  else
51
53
  connection.update(%[UPDATE #{table_name} SET document = #{document} WHERE #{_where_record record}])
52
54
  end
@@ -60,6 +62,19 @@ module MakeTextSearch
60
62
  "record_type = #{quote record.class.name} AND record_id = #{quote record.id}"
61
63
  end
62
64
 
65
+
66
+ # Query actions
67
+ def scope_search_text(model, query, language = Rails.application.config.make_text_search.default_language)
68
+ db_connection = model.connection
69
+
70
+ if language
71
+ query = "to_tsquery(#{db_connection.quote language}, #{db_connection.quote query})"
72
+ else
73
+ query = "to_tsquery(#{db_connection.quote query})"
74
+ end
75
+ model.where %[#{model.table_name}.id IN (SELECT record_id FROM #{Rails.application.config.make_text_search.table_name} WHERE record_type = #{db_connection.quote model.name} AND document @@ #{query})]
76
+ end
77
+
63
78
  end
64
79
  end
65
80
  end
@@ -26,7 +26,7 @@ module MakeTextSearch
26
26
  end
27
27
 
28
28
  def search_text(query)
29
- where MakeTextSearch.build_condition(self, query)
29
+ connection.text_search_adapter.scope_search_text(self, query)
30
30
  end
31
31
  end
32
32
 
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: make-text-search
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- version: "0.1"
9
+ - 1
10
+ version: 0.1.1
10
11
  platform: ruby
11
12
  authors:
12
13
  - Ayose Cazorla
@@ -30,10 +31,9 @@ files:
30
31
  - lib/make-text-search.rb
31
32
  - lib/generators/templates/migration.rb
32
33
  - lib/generators/migration.rb
33
- - lib/make-text-search/query.rb
34
34
  - lib/make-text-search/html_entities.dat
35
- - lib/make-text-search/models.rb
36
35
  - lib/make-text-search/filters.rb
36
+ - lib/make-text-search/models.rb
37
37
  - lib/make-text-search/adapters/postgresql_ts.rb
38
38
  - lib/make-text-search/schema.rb
39
39
  - test/schema_test.rb
@@ -1,8 +0,0 @@
1
- class <<MakeTextSearch
2
- def build_condition(model, query)
3
- # TODO use has_text_search_for_postgresql? to implement all the backends
4
-
5
- db_connection = model.connection
6
- %[#{model.table_name}.id IN (SELECT record_id FROM #{Rails.application.config.make_text_search.table_name} WHERE record_type = #{db_connection.quote model.name} AND document @@ to_tsquery(#{db_connection.quote query}))]
7
- end
8
- end