[
https://issues.apache.org/jira/browse/LUCENE-6950?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15073497#comment-15073497
]
Robert Muir commented on LUCENE-6950:
-------------------------------------
Thanks, the patch looks good.
As far as testing this, We could add simple unit tests for what it is doing
with fieldinfos in TestUninvertingReader. Similar to ones like
"testSortedSetInteger", but even simpler. just tests that add field to a single
document, wrap it, then assert stuff about the fieldinfos on the wrapped
reader. Particularly asserts about docvalues type (which we change if an
indexed field is configured for uninverting) would be good. We could have lots
of tests for the logic in there, e.g. one that adds a stored-only field and
then asserts dvType is still NONE, for example.
> DimensionalRangeQuery not working with UninvertingReader
> --------------------------------------------------------
>
> Key: LUCENE-6950
> URL: https://issues.apache.org/jira/browse/LUCENE-6950
> Project: Lucene - Core
> Issue Type: Bug
> Reporter: Ishan Chattopadhyaya
> Attachments: LUCENE-6950.patch, LUCENE-6950.patch, LUCENE-6950.patch
>
>
> As I was trying out dimensional fields for SOLR-8396, I realized that
> DimensionalRangeQuery is not working with UninvertingReader.
> In Solr, all directory readers are wrapped by an UninvertingReader and an
> ExitableDirectoryReader.
> Here's the error:
> {code}
> Exception in thread "main" java.lang.IllegalArgumentException: field="rating"
> was indexed with numDims=0 but this query has numDims=1
> at
> org.apache.lucene.search.DimensionalRangeQuery$1.scorer(DimensionalRangeQuery.java:186)
> at org.apache.lucene.search.Weight.bulkScorer(Weight.java:135)
> at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:667)
> at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:474)
> at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:593)
> at
> org.apache.lucene.search.IndexSearcher.searchAfter(IndexSearcher.java:451)
> at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:462)
> at
> DimensionalRangeQueryExample.query(DimensionalRangeQueryExample.java:66)
> {code}
> Here's an example program to trigger this failure:
> {code}
> import java.io.IOException;
> import java.util.HashMap;
> import java.util.Map;
> import java.util.Random;
> import org.apache.lucene.analysis.standard.StandardAnalyzer;
> import org.apache.lucene.document.DimensionalIntField;
> import org.apache.lucene.document.Document;
> import org.apache.lucene.document.Field;
> import org.apache.lucene.document.Field.Store;
> import org.apache.lucene.document.LegacyIntField;
> import org.apache.lucene.document.StringField;
> import org.apache.lucene.document.TextField;
> import org.apache.lucene.index.DirectoryReader;
> import org.apache.lucene.index.IndexWriter;
> import org.apache.lucene.index.IndexWriterConfig;
> import org.apache.lucene.index.StoredDocument;
> import org.apache.lucene.queryparser.classic.ParseException;
> import org.apache.lucene.search.DimensionalRangeQuery;
> import org.apache.lucene.search.IndexSearcher;
> import org.apache.lucene.search.LegacyNumericRangeQuery;
> import org.apache.lucene.search.Query;
> import org.apache.lucene.search.ScoreDoc;
> import org.apache.lucene.search.TopDocs;
> import org.apache.lucene.store.Directory;
> import org.apache.lucene.store.RAMDirectory;
> import org.apache.lucene.uninverting.UninvertingReader;
> import org.apache.lucene.util.BytesRef;
> public class DimensionalRangeQueryExample {
> public static void main(String[] args) throws IOException,
> ParseException {
> StandardAnalyzer analyzer = new StandardAnalyzer();
> Directory index = new RAMDirectory();
> IndexWriterConfig config = new IndexWriterConfig(analyzer);
> IndexWriter w = new IndexWriter(index, config);
> addDoc(w, "Lucene in Action", 1);
> addDoc(w, "Lucene for Dummies", 2);
> addDoc(w, "Managing Gigabytes", 3);
> addDoc(w, "The Art of Computer Science", 4);
> w.commit();
> w.close();
> DirectoryReader reader = (DirectoryReader.open(index));
> Map<String, UninvertingReader.Type> uninvertingMap = new
> HashMap<>();
> uninvertingMap.put("id", UninvertingReader.Type.BINARY);
> uninvertingMap.put("rating", UninvertingReader.Type.INTEGER);
> reader = UninvertingReader.wrap(reader, uninvertingMap);
> IndexSearcher searcher = new IndexSearcher(reader);
> Query legacyQuery =
> LegacyNumericRangeQuery.newIntRange("rating_legacy", 1, 4, true, true);
> Query dimensionalQuery =
> DimensionalRangeQuery.new1DIntRange("rating", 1, true, 4, true);
> System.out.println("Legacy query: ");
> query(legacyQuery, searcher); // works
> System.out.println("Dimensional query: ");
> query(dimensionalQuery, searcher); // fails
>
> reader.close();
> }
> private static void query(Query q, IndexSearcher searcher) throws
> IOException {
> int hitsPerPage = 10;
> TopDocs docs = searcher.search(q, hitsPerPage);
> ScoreDoc[] hits = docs.scoreDocs;
> System.out.println("Found " + hits.length + " hits.");
> for(int i=0;i<hits.length;++i) {
> int docId = hits[i].doc;
> StoredDocument d = searcher.doc(docId);
> System.out.println((i + 1) + ". " + d);
> }
> }
> private static void addDoc(IndexWriter w, String title, int rating)
> throws IOException {
> Document doc = new Document();
> String id = ""+new Random().nextInt(1000);
> byte idBytes[] = id.getBytes();
> doc.add(new StringField("id", new BytesRef(idBytes),
> Store.YES));
> doc.add(new TextField("title", title, Field.Store.YES));
> doc.add(new DimensionalIntField("rating", rating));
> LegacyIntField legacy = new LegacyIntField("rating_legacy",
> rating, Store.YES);
> legacy.setIntValue(rating);
> doc.add(legacy);
> w.addDocument(doc);
> }
> }
> {code}
> I don't yet know more as to why this could be. [~mikemccand] Any ideas,
> please?
> Apologies if I should've brought this up in the mailing lists, or as a
> comment in LUCENE-6917 itself.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]