Hi Mattias,
Thanks for the tip!
I started to look around and I think I found something. When "fulltext"
type index is created its type will be CustomType (subclass of IndexType
- IndexType is used for "exact" indexes) in neo4j. CustomType overrides
the addToDocument() of IndexType method, which is the function that
actually created a Lucene field.
IndexType's looks like this:
public void addToDocument( Document document, String key, Object value )
{
document.add( instantiateField( key, value, Index.NOT_ANALYZED ) );
}
CustomType's implementation on teh other hand:
@Override
public void addToDocument( Document document, String key, Object value )
{
document.add( new Field( exactKey( key ), value.toString(),
Store.YES, Index.NOT_ANALYZED ) );
document.add( instantiateField( key, value.toString(), Index.ANALYZED
) );
}
What I can see here is that CustomType's version explicitely converts
value to a String and therefore instantiateField won't detect it as a
number and will not create a NumericField for it.
Could this be the root of the problem?
I just replaced 'value.toString()' with 'value', and now my test runs OK
(and fulltext search for terms still work beside numeric range queries).
Regards,
---
balazs
On 6/28/11 4:41 PM, Mattias Persson wrote:
> Hi Balazs,
>
> I think the issue could be in lucene, with the mix of the
> white-space-tokenizing-analyzer and numeric values. I don't know. What I see
> in neo4j is that it treats the values the exact same way, the queries to the
> index is exactly the same, but it just doesn't return any values. I think
> there needs to be some more googling around this to get more answers.
>
>
> 2011/6/28 Balazs E. Pataki<[email protected]>
>
>> Hi,
>>
>> I'm playing around with indexing and numeric range queries according to
>> this documentation:
>>
>> http://docs.neo4j.org/chunked/snapshot/indexing-lucene-extras.html
>>
>> According to my tests numeric range queries
>> (QueryContext.numericRange()) only have effect when "exact" type index
>> is used.
>>
>>
>> I tried this:
>>
>> Transaction tx = graphDb.beginTx();
>> try {
>>
>> Index<Node> exactIndex = graphDb.index().forNodes("exactIndex",
>> MapUtil.stringMap( IndexManager.PROVIDER, "lucene", "type", "exact" ));
>> Index<Node> fulltextIndex = graphDb.index().forNodes("fulltextIndex",
>> MapUtil.stringMap( IndexManager.PROVIDER, "lucene", "type", "fulltext" ));
>>
>> Node n1 = graphDb.createNode();
>> n1.setProperty("foo", 5);
>> exactIndex.add(n1, "foo", ValueContext.numeric(5));
>> fulltextIndex.add(n1, "foo", ValueContext.numeric(5));
>>
>> Node n2 = graphDb.createNode();
>> n2.setProperty("foo", 25);
>> exactIndex.add(n2, "foo", ValueContext.numeric(25));
>> fulltextIndex.add(n2, "foo", ValueContext.numeric(25));
>>
>> // Force commit
>> tx.success();
>> tx.finish();
>> tx = graphDb.beginTx();
>>
>> //Search exact
>> QueryContext qctx = QueryContext.numericRange("foo", 3, 25);
>> IndexHits<Node> hits = exactIndex.query(qctx);
>> Iterator<Node> it = hits.iterator();
>> while (it.hasNext()) {
>> Node n = it.next();
>> System.out.println("Found foo in exact: "+n+":
>> "+n.getProperty("foo"));
>> }
>> assertEquals(2, hits.size());
>>
>> //Search fulltext
>> qctx = QueryContext.numericRange("foo", 3, 25);
>> hits = fulltextIndex.query(qctx);
>> it = hits.iterator();
>> while (it.hasNext()) {
>> Node n = it.next();
>> System.out.println("Found foo in fulltext: "+n+":
>> "+n.getProperty("foo"));
>> }
>> assertEquals(2, hits.size());
>>
>> tx.success();
>> } finally {
>> tx.finish();
>> }
>>
>> For the "exact" configured index the range query returns two nodes,
>> while in "fulltext" configured index I get no result.
>>
>> Is there a way to use numeric range queries with fulltext indexes?
>>
>> Thanks for any hints,
>> ---
>> balazs
>> _______________________________________________
>> Neo4j mailing list
>> [email protected]
>> https://lists.neo4j.org/mailman/listinfo/user
>>
>
>
>
_______________________________________________
Neo4j mailing list
[email protected]
https://lists.neo4j.org/mailman/listinfo/user