You should ask this question on the java-u...@lucene.apache.org mailing
list - you will likely find more people there who can help you.

Also note, I don't think that you can use doc values on triefields.

Upayavira


On Tue, Jul 14, 2015, at 08:06 AM, Peyman Faratin wrote:
> Hi
>
> I am having problems accessing float values in a lucene 5.0 index via
> the functionquery.
>
> My setup is as follows
>
> Indexing time
> ------------------
> Documentdoc = newDocument();


> FieldTypef = newFieldType();


> f.setStored(false);


> f.setNumericType(NumericType.FLOAT);


> f.setDocValuesType(DocValuesType.NUMERIC);


> f.setNumericPrecisionStep(4);


> f.setIndexOptions(IndexOptions.DOCS);


>


> for(Entry<Integer, Float> component:vector.entrySet()) {


> String w  = component.getKey().toString();


> Float score = component.getValue();


>


> doc.add(new FloatField(w, score, f));


> }


> writer.addDocument(doc);


> At end of indexing I do


>


> writer.forceMerge(1);


>


> writer.close();


>


> Search Time


> ------------------


> for(Entry<Integer,Float> vector:vectors.entrySet())


> {


> w = vector.getKey().toString();


> Float score = (Float) vector.getValue();


> Query  tq= NumericRangeQuery.newFloatRange(w, 0.0f, 100.0f,
> true, true);


> FunctionQuery  fq = newFunctionQuery( newFloatFieldSource(w) );


> CustomScoreQuery  customQ = new My_CustomScorerQuery(tq, fq,score);


> TopDocs topDocs = indexSearcher.search(customQ,10000);


> }


> where My_CustomScorerQuery() is defined as follows:


> public class My_CustomScorerQuery extends CustomScoreQuery{


> public My_CustomScorerQuery(Query mainQuery,FunctionQuery
> valSrcQuery,Float mainQueryScore) {


> super(mainQuery,valSrcQuery);


> this.mainQueryScore = mainQueryScore;


>       }


> public CustomScoreProvider
> getCustomScoreProvider(LeafReaderContext r) {


> return new My_CustomScorer(r);


> }


> private class My_CustomScorer extends CustomScoreProvider{


> public My_CustomScorer(LeafReaderContext context) {


> super(context);


> }


> public float customScore(int doc,float subQueryScore, float
> valSrcScore) {


> System.out.println("\thit lucene docID: "+doc+


> "\n\tquery score: "+mainQueryScore+


> "\n\tsubQueryScore: "+subQueryScore+


> "\n\tvalSrcScore: "+valSrcScore);


>


> return (float) (mainQueryScore * valSrcScore);


> }


> }


> }


> The problem I am seeing is that the `valSrcScore` is always 0, and
> sometimes disappears if I change the "setNumericPrecisionStep" above
> 4. I am indexing the following 2 docs


> Map<Integer, Float> doc1 = newLinkedHashMap<Integer, Float>();


> doc1.put(12,0.5f);


> doc1.put(18,0.4f);


> doc1.put(10,0.1f);


>


> indexer.indexVector("doc1", doc1);


>


> Map<Integer, Float> doc2 = newLinkedHashMap<Integer, Float>();


> doc2.put(10,0.9f);


> doc2.put(1,0.8f);


> doc2.put(9,0.2f);


>


> doc2.put(2,0.1f);


>


> and testing with the following query:


> Map<Integer, Float> query = newLinkedHashMap<Integer, Float>();


> query.put(10,0.8f);


> query.put(9,0.6f);


>


> query.put(2,0.01f);


>


> So field `10` in the query should have the following total scores for
> the two documents in the index


> score(query,doc0) = 0.8*0.1


> score(query,doc1) = 0.8*0.9


>


> but I only see


> score(query,doc0) = 0.8*0.0


> score(query,doc1) = 0.8*0.0


>


> i.e. FloatFieldSource is always returning 0. If I subclass
>      "FloatFieldSource" then accessing


>


> NumericDocValues arr =
> DocValues.getNumeric(readerContext.reader(), field);


>


> tells me "NumericDocValues of doc0: 0"  which _seems_ to suggest
> indexing does not contain the docvalues? I can see the docs fine in
> Luke. There is a subtle nuance (related to the way I am indexing the
> fields --> some fields in a doc are "not present" and some are).


>


> Any pointers would be much appreciated


>


> Peyman


>


>
>


>


Reply via email to