[hibernate-dev] [infinispan-dev] [HSearch] DSL for Lucene queries (was: Re: Query module new API and configurations)

Manik Surtani manik at jboss.org
Thu Aug 27 07:07:19 EDT 2009


Very elegant.  I'm generally a big fan of 'builder' patterns like  
this, but this really isn't a DSL, is it?  :)  When you first  
mentioned a DSL I had visions of defining a new grammar and an ANTLR  
parser, etc.  But that is overkill.

This approach certainly works, and will almost certainly perform  
better too.  One question: for the sake of brevity, why  
SealedQueryBuilder instead of QueryBuilder ?  :)

Also, I still think that if this is a generic helper factory that  
helps you build Lucene queries - and has no knowledge of how and where  
the query is used (why should it?) - then this should be something  
people can use outside of HS or Infinispan.  E.g., directly with Lucene.


On 26 Aug 2009, at 12:39, Emmanuel Bernard wrote:

> I've been thinking about a DSL to build Lucene queries in the last  
> day.
> What do you think of this proposal?
>
> A few remarks:
>  - it asks the analyzer so that we correctly apply the analyzer on  
> terms
>  - it has a few query factory methods
>  - it contains a few orthogonal operations
>  - I am not quite satisfied with how boolean is handled, any idea?
>
>
>
> Examples
>
>
> SealedQueryBuilder qb =  
> searchFactory.withEntityAnalyzer(Address.class);
>
>
> Query luceneQuery =
> qb.must(Occurs.MUST)
>     .add(
>         qb.boolean(Occurs.Should)
>             .add( qb.term("city",  
> "Atlanta").boostedTo(4).createQuery() )
>             .add( qb.term("address1",  
> "Peachtree").fuzzy().createQuery() )
>     )
>     .add(
>         qb.from("movingDate",  
> "200604").to("201201").exclusive().createQuery()
>     )
>     .createQuery();
>
>
>
> Analyzer choice
> queryBuilder.withAnalyzer(Analyzer)
> queryBuilder.withEntityAnalyzer(Class<?>)
> queryBuilder.basedOnEntityAnalyzer(Class<?>)
>                     .overridesForField(String field, Analyzer)
>                     .overridesForField(String field, Analyzer)
>                     .build() //sucky name
> returns a SealedQueryBuilder //sucky name
>
>
> SealedQueryBuilder contains the factory methods
>
>
>
>
> Factory methods
> Hosted onSealedQueryBuilder
>
>
> .term(String field, String text) //define a new query
> .term(String field, String text) //define a new query
>    .ignoreAnalyzer() //ignore the analyzer, optional
>    .fuzzy() //API prevent wildcard calls, optional
>      .threshold() //optional
>      .prefixLengh() //optional
> .term(String field, String value)
>    .wildcard() //API prevent fuzzy calls, optional
>
>
> //range query
> .from(String field, String text)
>        .exclusive() //optional
>     .to(String text)
>        .exclusive() //optional
>     .constantScore() //optional, due to constantScoreRangeQuery but  
> in practice inherited from the common operations
>
>
> //match all docs
> .all()
>
>
> //phrase query
> .phrase(String field)
>     .ignoreAnalyzer() //ignore the analyzer, optional
>     .addWord(String text) //at least one
>     .addWord(String text)
>     .sentence(String text) //do we need that?
>     .slop() //optional
>
>
> //search multiple fields for same value
> .searchInMultipleFields()
>   .onField(String field)
>       .boostedTo(float) //optional
>       .ignoreAnalyzer() //optional
>   .onField(String field)
>   .forWords(String) //do we need that?
>   .forWord(String)
>
>
>
>
> Boolean operations
> SealedQueryBuilder contains the boolean methods
>
>
> .boolean(Occurs occurs)
>
>   .add( qb.from().to() )
>   .add( ... )
>
>
>
>
> Works on all queries
>     .boostedTo()
>     .constantScore()
>     .filter(Filter) //filter the current query
>     .scoreMultipliedByField(field) //FieldScoreQuery +  
> FunctionQuery?? //Not backed
>     .createQuery()
>
>
>
>
> Todo
> Span*Queries
>
> MultiPhraseQuery - needs to fillup all accepted terms
> FieldScoreQuery
> ValueSourceQuery
> FuzzyLikeThis
> MoreLikeThis
>
>
> On 25 août 09, at 16:43, Manik Surtani wrote:
>
>>
>> On 25 Aug 2009, at 13:34, Emmanuel Bernard wrote:
>>
>>>
>>> On 25 août 09, at 14:27, Manik Surtani wrote:
>>>
>>>> A DSL would work, but I'd rather not define our own language here.
>>>> Which is why I asked for a standard.  Perhaps something based on  
>>>> SQL/
>>>> JPA-QL?  Or are you thinking  DSL specific to Lucene - which could
>>>> be used by any/all of {Lucene, Hibernate Search, Infinispan}?  In
>>>> which case the DSL should ideally be a Lucene project.
>>>
>>> Yes I was thinking about a DSL used for Hibernate Search and maybe  
>>> all
>>> of Lucene if the HS integration benefits offer no value towards
>>> simplicity (but I think i can offer value).
>>
>>
>> Ok, this should be interesting.  Lets chat about this some more -  
>> have
>> you drafted any thoughts around this DSL somewhere?
>
>
>
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev

--
Manik Surtani
manik at jboss.org
Lead, Infinispan
Lead, JBoss Cache
http://www.infinispan.org
http://www.jbosscache.org




-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/hibernate-dev/attachments/20090827/bb6c3ef1/attachment.html 


More information about the hibernate-dev mailing list