Thanks for the tip, Adrien!

Ranganath,
you can call isMatch() on your explanation. That way you know your query
(for a specific field) matched a certain document.

Query query = // create your query as you normally would, for 1 specific
field
Explanation ex = searcher.explain(query, docID);
if (ex.isMatch()){
    //Your query matched on the field
}

Note that docID in the example is the -lucene- docID, so you'll have to get
your searchresults first.

Regards,
Frederik

On Thu, Jun 22, 2017 at 2:37 PM, Ranganath B N <ranganath....@huawei.com>
wrote:

> Hi Adrien,
>
>    Using Explanation object, how do you get know which are the matching
> fields in a document for a query. In my case, I tried DisjunctionMaxQuery
> with tiebreaking matcher as
> 0.01f. what is the meaning of this argument?. After searching with the
> DisjunctionMaxQuery,
> I tried explain method of the searcher against this query and a hit
> document. I used
> getdescription()  and toString() method but got some output as
>
> "
> explan getdesc=max plus 0.01 times others of:
> explan tostring=8.773912 = max plus 0.01 times others of:
>   8.773912 = sum of:
>     8.773863 = weight(text2:abababababa11#abc10#abc16#a16#2 in 1066)
> [BM25Similarity], result of:
>       8.773863 = score(doc=1066,freq=1.0 = termFreq=1.0
> ), product of:
>         8.8049755 = idf, computed as log(1 + (docCount - docFreq + 0.5) /
> (docFreq + 0.5)) from:
>           1.0 = docFreq
>           10000.0 = docCount
>         0.99646646 = tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 *
> (1 - b + b * fieldLength / avgFieldLength)) from:
>           1.0 = termFreq=1.0
>           1.2 = parameter k1
>           0.75 = parameter b
>           28.2 = avgFieldLength
>           28.444445 = fieldLength
>     4.9819588E-5 = weight(text2:regular in 1066) [BM25Similarity], result
> of:
>       4.9819588E-5 = score(doc=1066,freq=1.0 = termFreq=1.0
> ), product of:
>         4.999625E-5 = idf, computed as log(1 + (docCount - docFreq + 0.5)
> / (docFreq + 0.5)) from:
>           10000.0 = docFreq
>           10000.0 = docCount
>         0.99646646 = tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 *
> (1 - b + b * fieldLength / avgFieldLength)) from:
>           1.0 = termFreq=1.0
>           1.2 = parameter k1
>           0.75 = parameter b
>           28.2 = avgFieldLength
>           28.444445 = fieldLength"
>
>
>
>
>
> How to know the matching fields from an Explanation Object?
>
>
> Regards,
> Ranganath B. N.
>
>
> -----Original Message-----
> From: Adrien Grand [mailto:jpou...@gmail.com]
> Sent: Thursday, June 22, 2017 12:55 PM
> To: java-user@lucene.apache.org
> Subject: Re: Get matching fields from a BooleanQuery
>
> Hi Frederik,
>
> Using explain should be fine for that use-case since you will only apply
> it to the top hits. Otherwise you could use the low-level search APIs in
> order to do this. It would look something like that if you want to find
> which query among `queries` matches document `docID` (I did not check it
> compiles but it should give the idea):
>
> List<Query> queries;
> int docID;
> IndexSearcher searcher;
> int leafIndex = ReaderUtil.subIndex(docID, searcher.getIndexReader().
> leaves());
> LeafReaderContext leaf = searcher.getIndexReader().
> leaves().get(leafIndex);
> int leafDocID = docID - leaf.docBase;
> for (Query query : queries) {
>   Weight weight = searcher.createNormalizedWeight(query);
>   Scorer scorer = weight.scorer(leaf);
>   boolean matches = scorer.advance(leafDocID) == leafDocID; }
>
> Le lun. 19 juin 2017 à 11:24, Frederik Van Hoyweghen <
> frederik.vanhoyweg...@chapoo.com> a écrit :
>
> > Hey everyone,
> >
> > To start, we are using Lucene 4.3.
> >
> > To search, we prepare several queries and combine these into a
> > BooleanQuery.
> > What we are looking for is a way to determine on which specific fields
> > a certain document matched.
> > For example, I create 2 queries: one to search in the "Name" field,
> > and another to search in the "Description" field.
> >
> > Combining these into a BooleanQuery and running it will return the
> > matching documents, but we'd like to know for each document returned
> > whether there was a match in the Name field or in the Description
> > field.
> >
> > It seems to me that something like the highlighter would need to know
> > this too but highlighting isn't a goal currently. I've also looked at
> > indexsearcher.explain() but the doc says that this is as expensive as
> > running the query against the entire index, so I'd obviously like to
> > avoid running the same queries mutliple times :).
> >
> > Kind regards,
> > Frederik
> >
>

Reply via email to