更大的问题是solr甚至能够支持这个吗?我知道我已经看到lucene能够做到这一点,solr建立在lucene上。
我在某个地方看到了一个使用谷歌的例子,但似乎无法再找到它,而且示例并不完整,因为我认为它没有关于我如何为lucene编写查询语句的查询部分。我记得看过一个NumericField,还有一个NumericComparator。
基本上,我正在尝试一个提供索引的noSQL orm解决方案(在github上)(尽管客户端决定每个表有多少索引和分区方法但你添加了索引并自己删除它们并且可以使用namedQueries尽管你必须先在查询之前按名称获取索引,因为一个表可能有数百万个索引)。我想要实现的两个主要内容是它都可以使用内存中的nosql伪db和内存索引(lucene的RAMDirectory)然后我想将它们切换为插入cassandra和SOLR。
我基本上需要
现在,如果您需要更多详细信息,可以在以下位置找到项目的主要查询代码 https://github.com/deanhiller/nosqlORM/blob/master/input/javasrc/com/alvazan/orm/layer3/spi/index/inmemory/MemoryIndexWriter.java
并且在第172行,您可以看到我每次都添加一个新的字段,但不幸的是其中一些可能是整数。
大问题:SOLR甚至可以支持int与字符串吗? (如果不是,我将不得不使用填充前面的填充0,长度等等,所以所有的整数都是相同的长度)。
如果SOLR可以支持它,那么在lucene中最好的方法是什么,或者有一个很好的例子吗?
从NoSqlEntityManager.getIndex(Class clazz,String indexPartitionName)检索的主索引接口是(虽然不确定是否重要).. https://github.com/deanhiller/nosqlORM/blob/master/input/javasrc/com/alvazan/orm/api/Index.java
感谢, 迪安
答案 0 :(得分:9)
<!--
Default numeric field types. For faster range queries, consider the tint/tfloat/tlong/tdouble types.
-->
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
<!--
Numeric field types that index each value at various levels of precision
to accelerate range queries when the number of values between the range
endpoints is large. See the javadoc for NumericRangeQuery for internal
implementation details.
Smaller precisionStep values (specified in bits) will lead to more tokens
indexed per value, slightly larger index size, and faster range queries.
A precisionStep of 0 disables indexing at different precision levels.
-->
<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
因此,如果您将字段索引为上述字段之一,则通过其字段名称查询(例如myIntField:1234
)它将执行“正确的操作”,您也可以对其进行范围搜索({{ 1}})。浮子等也一样。
答案 1 :(得分:2)
我认为我们可以利用org.apache.lucene.document.NumericField类。在这个类中,我们可以调用set方法,它可以支持int,log,float和double。 对于其他数据类型(例如bool,datetime),我们可以进行特殊转换,将它们更改为int或long类型。
顺便说一下,我看到了lucene的最新源代码,涉及新的clases:FloatField,IntField,LongField和DoubleField。它将包含在下一个版本中。 http://svn.apache.org/repos/asf/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/document/