You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by "Ishan Chattopadhyaya (JIRA)" <ji...@apache.org> on 2015/12/28 15:48:49 UTC

[jira] [Updated] (LUCENE-6950) DimensionalRangeQuery not working with UninvertingReader

     [ https://issues.apache.org/jira/browse/LUCENE-6950?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ishan Chattopadhyaya updated LUCENE-6950:
-----------------------------------------
    Description: 
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.

  was:
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 SOLR-6917 itself.


> 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
>
> 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: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org