[infinispan-dev] [HSearch] Query DSL step 1
Michael Neale
michael.neale at gmail.com
Mon Sep 28 06:41:31 EDT 2009
FYI a string based QL is of interest in terms of non java clients into
an "infinispan database/grid" - also it has proven popular in JCR
(which doesn't have a "fluent" style DSL, granted..).
After all, hibernate QL was/still is popular right?
On Mon, Sep 28, 2009 at 8:38 PM, Emmanuel Bernard
<emmanuel at hibernate.org> wrote:
> There are several steps to the query DSL:
> 1. implement the initial ideas and see what problems we face and how well
> that fits
> 2. add analyzers into the mix to transparently use the right one
> 3. add parameters that use the conversion bridge (not sure how well that
> could fly but an interesting idea
> 4. build up the stack of operators integrated into the DSL
> 5. string based QL using this API (not convinced yet but why not).
>
> Navin will start working on 1 and if things go well 2 (we will have a
> fantastic tool already we do just that).
> Here are my notes based on the initial idea + the feedback received.
>
> 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?
> Design remarks:
> - should we use interfaces or plain implementations? I would start with
> plain implementations to make things easier
> - let's put it in org.hibernate.search.query.dsl for now
> Examples
> SealedQueryBuilder qb = searchFactory.withEntityAnalyzer(Address.class);
> Query luceneQuery = qb.must()
> .add(
> qb.should()
> .add( qb.term("city", "Atlanta").boostedTo(4).createQuery() )
> .add( qb.term("address1", "Peachtree").fuzzy().createQuery() )
> )
> .add(
>
> qb.range("movingDate").from("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
> //Alternative
> .term().on(String field).matches(String text)
> .on(String field).matches(String text)
>
> .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
> .rangeQuery(String field)
> .from(String text)
> .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
> .must()
> .add( qb.from().to() )
> .add( ... )
> .must().not()
> .should()
>
> 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
>
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>
--
Michael D Neale
home: www.michaelneale.net
blog: michaelneale.blogspot.com
More information about the infinispan-dev
mailing list