In your example, it looks like you wanted the second term to match based on
the first character, or prefix, of the term.

While you could use a WildcardQuery with a term value of "term2FirstChar*",
PrefixQuery seemed like the simpler approach. WildcardQuery can handle more
general cases, like if you want to match on something like "a*b*c".

Technically, the PrefixQuery compiles down to a slightly simpler automaton,
but I only figured that out by writing a simple unit test:

    public void testAutomata() {
        Automaton prefixAutomaton = PrefixQuery.toAutomaton(new
BytesRef("a"));
        Automaton wildcardAutomaton = WildcardQuery.toAutomaton(new
Term("foo", "a*"));

        System.out.println("PrefixQuery(\"a\")");
        System.out.println(prefixAutomaton.toDot());
        System.out.println("WildcardQuery(\"a*\")");
        System.out.println(wildcardAutomaton.toDot());
    }

That produces the following output:

PrefixQuery("a")
digraph Automaton {
  rankdir = LR
  node [width=0.2, height=0.2, fontsize=8]
  initial [shape=plaintext,label=""]
  initial -> 0
  0 [shape=circle,label="0"]
  0 -> 1 [label="a"]
  1 [shape=doublecircle,label="1"]
  1 -> 1 [label="\\U00000000-\\U000000ff"]
}
WildcardQuery("a*")
digraph Automaton {
  rankdir = LR
  node [width=0.2, height=0.2, fontsize=8]
  initial [shape=plaintext,label=""]
  initial -> 0
  0 [shape=circle,label="0"]
  0 -> 1 [label="a"]
  1 [shape=doublecircle,label="1"]
  1 -> 2 [label="\\U00000000-\\U0010ffff"]
  2 [shape=doublecircle,label="2"]
  2 -> 2 [label="\\U00000000-\\U0010ffff"]
}



On Tue, 18 Feb 2020 at 13:52, <baris.ka...@oracle.com> wrote:

> Michael and Forum,-
> Thanks for thegreat explanations.
>
> one question please:
>
> why is PrefixQuery used instead of WildCardQuery in the below snippet?
>
> Best regards
>
> > On Feb 17, 2020, at 3:01 PM, Michael Froh <msf...@gmail.com> wrote:
> >
> > Hi Baris,
> >
> > The idea with PhraseWildcardQuery is that you can mix literal "exact"
> terms
> > with "MultiTerms" (i.e. any subclass of MultiTermQuery). Using addTerm is
> > for exact terms, while addMultiTerm is for things that may match a number
> > of possible terms in the given position.
> >
> > If you want to search for term1 followed by any term that starts with a
> > given character, I would suggest using:
> >
> > int maxMultiTermExpansions = ...; // Discussed below
> > PhraseWildCardQuery.Builder builder = new PhraseWildcardQuery("field",
> > maxMultiTermExpansions);
> > builder.addTerm(new BytesRef("term1")); // Add fixed term in position 0
> > builder.addMultiTerm(new PrefixQuery(new Term("field",
> "term2FirstChar")));
> > // Add multiterm in position 1
> > Query q = builder.build();
> >
> > The PrefixQuery effectively gets expanded into a bunch of possible terms,
> > based on the term dictionary on each index segment. To avoid expanding to
> > cover too many terms (say, if you added a bunch of WildcardQuery),
> > maxMultiTermExpansions serves as a guard rail, to put a rough bound on
> > memory consumption and query execution time. If you're interested in
> > details of how the maxMultiTermExpansions budget is distributed across
> > MultiTerms, check out PhraseWildcardQuery.createWeight. If you're just
> > running an experiment in your IDE, you could probably set
> > maxMultiTermExpansions to Integer.MAX_VALUE. (If you're running in a
> > production environment, it's likely a good idea to tune it down based on
> > your memory/latency constraints.)
> >
> > Incidentally, for tracking down the source code for anything in Lucene,
> > it's probably better to go to GitHub for the most up-to-date source:
> >
> https://urldefense.com/v3/__https://github.com/apache/lucene-solr/blob/master/lucene/sandbox/src/java/org/apache/lucene/search/PhraseWildcardQuery.java__;!!GqivPVa7Brio!ONqQgLIltNBUuSo5Cn_Fz7-wuR1LQv68YS_z-6g7X-S86PHQtT9tKl7VbIq9tVLYyw$
> > .
> >
> > Hope that helps,
> > Michael
> >
> >> On Thu, 13 Feb 2020 at 12:29, <baris.ka...@oracle.com> wrote:
> >>
> >> Hi,-
> >>
> >> i hope everyone is doing great.
> >>
> >>  if i want to do the following search with PhraseWildCardQuery and
> >> thanks to this forum for letting me know about this class (Especially to
> >> David and Bruno)
> >>
> >> term1 term2FirstChar*
> >>
> >> i need to do two ways: (i found the source code at
> >>
> >>
> https://urldefense.com/v3/__https://fossies.org/linux/lucene/sandbox/src/java/org/apache/lucene/search/PhraseWildcardQuery.java__;!!GqivPVa7Brio!ONqQgLIltNBUuSo5Cn_Fz7-wuR1LQv68YS_z-6g7X-S86PHQtT9tKl7VbIpV8n29nQ$
> >> )
> >>
> >> /*
> >>
> >> maxMultiTermExpansions - The maximum number of expansions across all
> >> multi-terms and across all segments. It counts expansions for each
> >> segments individually, that allows optimizations per segment and unused
> >> expansions are credited to next segments. This is different from
> >> MultiPhraseQuery and SpanMultiTermQueryWrapper which have an expansion
> >> limit per multi-term.
> >>
> >> segmentOptimizationEnabled - Whether to enable the segment optimization
> >> which consists in ignoring a segment for further analysis as soon as a
> >> term is not present inside it. This optimizes the query execution
> >> performance but changes the scoring. The result ranking is preserved.
> >>
> >> */
> >>
> >>
> >> 1st way:
> >>
> >> PhraseWildCardQuery.Builder builder = PharseWildCardQuery.Builder(field,
> >> 2 _*/<<< i dont know what number to use here for
> >> maxMultiTermExpansions>>>/*_, true/*boolean
> segmentOptimizationEnabled*/)
> >>
> >> pwcqBuilder.addTerm(field, new Term(field, "term1"));
> >>
> >> pwcqBuilder.addTerm(field,new Term(field, "term2FirstChar"));
> >>
> >> PhraseWildCardQuery pwcq = pwcqBuilder.build();
> >>
> >> or
> >>
> >> 2nd way:
> >>
> >> pwcqBuilder.addMultiTerm(MultiTermQuery object here contaning {field,
> >> "term1"} and {field ,"term2FirstChar"});
> >>
> >> PhraseWildCardQuery pwcq = pwcqBuilder.build();
> >>
> >>
> >> Then this pwcq object will be fed into IndexSearcher's as the query
> >> parameter.
> >>
> >>
> >> Now, it looks like the first way will not consider expansions or in
> >> other words wildcard? Am i right?
> >>
> >> i also need to understand this maxMultiTermExpansions parameter better.
> >> For instance if first way is used, will maxMultiTermExpansions be
> >> meaningful?
> >>
> >>
> >> Thanks
> >>
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
> For additional commands, e-mail: java-user-h...@lucene.apache.org
>
>

Reply via email to