I am still not sure of what benefits we see from the new query type. As
Adrien mentioned,  Lucene queries are dependent on term specific statistics.

I can imagine that this approach would save some GC cycles by reusing the
same object, but you would need to have a very large number of objects for
that to make a significant difference. In any case, for a user to emulate
this behaviour, it should be a simple matter of writing a custom
QueryVisitor.

On Wed, 23 Oct 2019 at 17:52, Stamatis Zampetakis <zabe...@gmail.com> wrote:

> Hi Adrien,
>
> Are there optimizations based on statistics that take place during the
> construction process of the query?
>
> When the query is about to be executed (passing it to the searcher) all
> parameters must be bound.
> So in terms of optimizations I was thinking that nothing would change.
>
> To make sure that we are all in the same page, I created a simple gist [1]
> of how I had in mind to support parameterized queries in Lucene.
> If you think that it is a bad idea then I will go back to the option of
> recreating the query every time.
>
> Best,
> Stamatis
>
> [1] https://gist.github.com/zabetak/ac2a8320c72779dd646230278662fdd4
>
>
> On Wed, Oct 23, 2019 at 11:41 AM Adrien Grand <jpou...@gmail.com> wrote:
>
> > I agree with Atri that it makes little sense to support parameterized
> > queries like this. Lucene not only uses field statistics but also term
> > statistics, so we couldn't make decisions about the right way to
> > execute this query before knowing what the value of `a.name` is.
> > Supporting something like that would send the message that it makes
> > things more efficient while in practice it would only save a couple
> > object creations.
> >
> > On Wed, Oct 23, 2019 at 9:26 AM Stamatis Zampetakis <zabe...@gmail.com>
> > wrote:
> > >
> > > Hi Atri,
> > >
> > > Let's assume that we have the following simple SQL query over a Lucene
> > > index holding book authors.
> > >
> > > SELECT *
> > > FROM authors a
> > > WHERE a.name = ? AND a.age > 15
> > >
> > > The where clause corresponds to a BooleanQuery combining a TermQuery
> and
> > a
> > > IntPoint query.
> > > During the prepare phase of the SQL statement we cannot really
> construct
> > > the BooleanQuery since the parameter
> > > is not yet bound. We have to postpone the creation of the query to the
> > > execution time of the statement where all parameters are bound. Running
> > the
> > > same query many times with a different parameter means recreating the
> > Query
> > > every time.
> > >
> > > I admit that creation of the Lucene query is not the most expensive
> part
> > of
> > > the planning process still we can gain something by not creating the
> > whole
> > > query for every single parameter.
> > >
> > > In terms of design it appears more natural to build the Lucene query
> > during
> > > the preparation phase and not during the execution phase.
> > >
> > > Best,
> > > Stamatis
> > >
> > >
> > >
> > >
> > > On Mon, Oct 21, 2019 at 2:20 PM Atri Sharma <a...@apache.org> wrote:
> > >
> > > > I am curious — what use case are you targeting to solve here?
> > > >
> > > > In relational world, this is useful primarily due to the fact that
> > prepared
> > > > statements eliminate the need for re planning the query, thus saving
> > the
> > > > cost of iterating over a potentially large combinatorial space.
> > However,
> > > > for Lucene, there isn’t so much of a concept of a query plan (yet).
> > Some
> > > > queries try to achieve that (IndexOrDocValuesQuery for eg), but it is
> > a far
> > > > cry from what relational databases expose.
> > > >
> > > > Atri
> > > >
> > > > On Mon, 21 Oct 2019 at 17:42, Stamatis Zampetakis <zabe...@gmail.com
> >
> > > > wrote:
> > > >
> > > > > Hi al
> > > > > In the world of relational databases and SQL, the existence of
> > > > > parameterized queries (aka. PreparedStatement) offers many
> > advantages in
> > > > > terms of security and performance.
> > > > >
> > > > > I guess everybody is familiar with the idea that you prepare a
> > statement
> > > > > and then you execute it multiple times by just changing certain
> > > > parameters.
> > > > > A simple use case for demonstrating the idea
> > > > > is shown below:
> > > > >
> > > > > Query q = ... // An arbitrary complex query with a part that has a
> > single
> > > > > parameter of type int
> > > > > for (int i=0; i<100; i++) {
> > > > >   int paramValue = i;
> > > > >   q.visit(new ParameterSetter(paramValue));
> > > > >   TopDocs docs = searcher.search(q, 10);
> > > > > }
> > > > >
> > > > > Note that this is a very simplistic use case and does not
> correspond
> > to
> > > > the
> > > > > reality where the construction and execution are not done side by
> > side.
> > > > >
> > > > > I already implemented something to satisfy use-cases like the one
> > shown
> > > > > above by introducing a new subclass of Query. However, I was
> > wondering if
> > > > > there is already a mechanism to compile and execute queries with
> > > > parameters
> > > > > in Lucene and I am just reinventing the wheel.
> > > > >
> > > > > Feedback is much appreciated!
> > > > >
> > > > > Best,
> > > > > Stamatis
> > > > >
> > > > --
> > > > Regards,
> > > >
> > > > Atri
> > > > Apache Concerted
> > > >
> >
> >
> >
> > --
> > Adrien
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
> > For additional commands, e-mail: java-user-h...@lucene.apache.org
> >
> >
>
-- 
Regards,

Atri
Apache Concerted

Reply via email to