Alain Ravet
2007-May-16 18:55 UTC
[Ferret-talk] bilingual site: exclude fields set from query
Hi all, Is there a way to have searches no use some indexed fields, when processing a query? context: I have a model Foo that holds some information in two languages : - text1_nl, text2_nl, text3_nl and - text1_en, text2_en, text3_en Some other fields are common to both languages and indexed as well - first_name, last_name Depending on the visitor language choice I need to exclude the first three, or last three fields when query processing. Is this doable relatively simply? I guess I could use two indexes, but I''d like to keep using acts_as_ferret if possible. TIA. Alain Ravet -------- http://blog.ravet.com
Doug Smith
2007-May-16 20:42 UTC
[Ferret-talk] bilingual site: exclude fields set from query
I would setup your models differently, using Single-Table Inheritance (STI). (You can get more info on it by Googling "rails single table inheritance".) For your example, you''d have a table with columns like: id, type, first_name, last_name, text1, text2, text3 Then, you''d have a model like: class Text << ActiveRecord::Base acts_as_ferret(... declare all fields here ) end You''d then subclass this with two other classes: class EnglishText << Text end class DutchText << Text end Then, to search one or the other, use: EnglishText.find_by_contents("english query") DutchText.find_by_contents("dutch query") That''s a rough idea without exact code, but it should hopefully get you started. Thanks, Doug On 5/16/07, Alain Ravet <alain.ravet+ferret at gmail.com> wrote:> > Hi all, > > Is there a way to have searches no use some indexed fields, when > processing a query? > > context: > I have a model Foo that holds some information in two languages : > - text1_nl, text2_nl, text3_nl > and > - text1_en, text2_en, text3_en > Some other fields are common to both languages and indexed as well > - first_name, last_name > > Depending on the visitor language choice I need to exclude the first > three, or last three fields when query processing. Is this doable > relatively simply? > I guess I could use two indexes, but I''d like to keep using > acts_as_ferret if possible. > > > TIA. > > > Alain Ravet > -------- > http://blog.ravet.com > _______________________________________________ > Ferret-talk mailing list > Ferret-talk at rubyforge.org > http://rubyforge.org/mailman/listinfo/ferret-talk >-------------- next part -------------- An HTML attachment was scrubbed... URL: http://rubyforge.org/pipermail/ferret-talk/attachments/20070516/23c3c226/attachment-0001.html
Alain Ravet
2007-May-16 21:43 UTC
[Ferret-talk] bilingual site: exclude fields set from query
Doug > I would setup your models differently, using Single-Table Inheritance STI would be impractical (I don''t want to add a useless "type" column), but plain inheritance sounds like a very good idea. > class Text << ActiveRecord::Base > acts_as_ferret(... declare all fields here ) > end> > You''d then subclass this with two other classes: > > class EnglishText << Text > end > class DutchText << Text > end I guess you meant : class Text << ActiveRecord::Base end class EnglishText << Text acts_as_ferret :fields => [name, text_en] end class DutchText << Text acts_as_ferret :fields => [name, text_nl] end That would indeed allow to call : > EnglishText.find_by_contents("english query") > DutchText.find_by_contents ("dutch query") Clean and simple. Thanks a lot. Alain Ravet ---- http://blog.ravet.com
Jens Kraemer
2007-May-21 11:33 UTC
[Ferret-talk] bilingual site: exclude fields set from query
On Wed, May 16, 2007 at 08:55:46PM +0200, Alain Ravet wrote:> Hi all, > > Is there a way to have searches no use some indexed fields, when > processing a query? > > context: > I have a model Foo that holds some information in two languages : > - text1_nl, text2_nl, text3_nl > and > - text1_en, text2_en, text3_en > Some other fields are common to both languages and indexed as well > - first_name, last_name > > Depending on the visitor language choice I need to exclude the first > three, or last three fields when query processing. Is this doable > relatively simply? > I guess I could use two indexes, but I''d like to keep using > acts_as_ferret if possible.A query string like text1_nl|text2_nl|text3_nl|first_name|last_name:query will only search for query in the named fields. Jens -- Jens Kr?mer webit! Gesellschaft f?r neue Medien mbH Schnorrstra?e 76 | 01069 Dresden Telefon +49 351 46766-0 | Telefax +49 351 46766-66 kraemer at webit.de | www.webit.de Amtsgericht Dresden | HRB 15422 GF Sven Haubold, Hagen Malessa
Alain Ravet
2007-May-21 16:03 UTC
[Ferret-talk] bilingual site: exclude fields set from query
Jens, > A query string like > text1_nl|text2_nl|text3_nl|first_name|last_name:query > will only search for query in the named fields. Thanks. Is this the proper syntax for multi-words queries: first_name|last_name:(jo* OR va*) ? Alain
Benjamin Krause
2007-May-21 16:49 UTC
[Ferret-talk] bilingual site: exclude fields set from query
Hey Alain, finally jumped on board? :-) hope to see you in berlin in a few month ..> Is this the proper syntax for multi-words queries: > > first_name|last_name:(jo* OR va*)i would suggest to use the OO-Syntax for more complex queries .. like that: query = BooleanQuery.new [ :first_name, :last_name ].each do |key| query.add_query( PrefixQuery.new( key, ''jo'' ), :should ) end for a people-livesearch, i do something like [1]: def build_livesearch_query( fields, q ) q = filter_special_characters( q ) # custom method query = BooleanQuery.new fields.uniq.each do |field| sq = SpanNearQuery.new(:in_order => true, :slop => 1) terms = analyze_query(q, field) # custom method terms.each do |term| sq << SpanPrefixQuery.new( field, term ) end query << sq end query end i call that like build_livesearch_query( [:first_name, :last_name, :email, q ) # q is an array of search words Ben [1] all of the code at http://bugs.omdb.org/browser/trunk/lib/omdb/ ferret/local_search.rb
Alain Ravet
2007-May-21 17:10 UTC
[Ferret-talk] bilingual site: exclude fields set from query
Hi Ben, > Hey Alain, > finally jumped on board? :-) hope to see you in berlin in a few months Can''t wait to register. My credit card is on the starting-blocks. > > Is this the proper syntax for multi-words queries: > > first_name|last_name:(jo* OR va*) > > i would suggest to use the OO-Syntax for more complex queries .. like > query = BooleanQuery.new I''m refactoring/upgrading an "old" (1-year) app, where I used to do all the ferret index stuff myself (callbacks, queries, ..), to the mucho simpler interface offered by acts_as_ferret. AFAIK, aaf only works with string queries, so if there is a string-based solution that works, I''d rather use this one. If there is none, I''ll bite the bullet and follow your advice. "A man''s got to do, what a man''s got to do" Alain -- Alain Ravet -------- http://blog.ravet.com
Benjamin Krause
2007-May-21 19:02 UTC
[Ferret-talk] bilingual site: exclude fields set from query
> > I''m refactoring/upgrading an "old" (1-year) app, where I used to do > all the ferret index stuff myself (callbacks, queries, ..), to the > mucho simpler interface offered by acts_as_ferret. AFAIK, aaf only > works with string queries, so if there is a string-based solution that > works, I''d rather use this one. If there is none, I''ll bite the bullet > and follow your advice. "A man''s got to do, what a man''s got to do"Alain, i''m no AAF expert, but afaik most methods of aaf are using find_id_by_contents.. which is accepting a query parameter.. that query parameter gets forwarded to ferrets own search_each. search_each accepts strings or ferret query objects.. so i would assume that you can pass a OO-Query to AAF. And anything else would have surprised me.. as Jens code is quite sophisticated :-) Ben