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
Apparently Analagous Threads
- Error in documentation for ?legend
- Error in if (nuhat < 2) stop("The degrees of freedom must be greater than or equal to 2") : missing value where TRUE/FALSE needed
- Sata and R users GLM methods translation
- Error in documentation for ?legend
- Threaded logging?