5

より大きな問題は、solrがこれをサポートできるかどうかです。私は、luceneがこれを実行できることを確認しており、solrはlucene上に構築されています。

どこかでグーグルを使った例を見たことがありますが、それを再び見つけることができないようです。また、luceneのクエリステートメントの記述方法に関するクエリ部分がないと思われるという点で、例は完全ではありませんでした。NumericFieldを見たのを覚えていますが、このNumericComparatorがあります。

基本的に、私はインデックス作成(github上)を提供するnoSQL ormソリューションを試しています(ただし、クライアントはテーブルごとのインデックス数とパーティション分割方法を決定しますが、インデックスにエンティティを追加して自分で削除し、namedQueriesを使用できます。 1つのテーブルに数百万のインデックスがある可能性があるため、クエリの前に最初に名前でインデックスを作成します)。私が達成したい2つの主なことは、すべてがメモリ内のnosql偽のdbとメモリ内のインデックス(luceneのRAMDirectory)で機能することです。次に、それらをcassandraとSOLRのプラグインに切り替えます。

私は基本的にする必要があります

  1. 整数、浮動小数点数などを格納する方法を理解します。
  2. ターゲットが文字列、float、intなどの場合にluceneクエリを作成する方法を理解します。

現在、詳細が必要な場合は、プロジェクトのメインクエリコードが https://github.com/deanhiller/nosqlORM/blob/master/input/javasrc/com/alvazan/orm/layer3/spi/index/にあります。 inmemory / MemoryIndexWriter.java

172行目では、毎回新しいフィールドを追加していることがわかりますが、残念ながら、これらの一部はintである可能性があります。

大きな質問:SOLRはintとstringをサポートすることもできますか?(そうでない場合は、int、longなどの前に0をパディングするハックを使用する必要があるため、すべてのintが同じ長さになります)。

SOLRがそれをサポートできる場合、Luceneで最良の方法は何ですか、またはこれの良い例はありますか?

NoSqlEntityManager.getIndex(Class clazz、String indexPartitionName)から取得されたメインのインデックスインターフェイスは(重要かどうかはわかりませんが)です 。https://github.com/deanhiller/nosqlORM/blob/master/input/javasrc/com/alvazan/ orm / api / Index.java

ありがとう、ディーン

4

2 に答える 2

9

サンプルのSOLRSchema.xmlファイルから:

<!--
      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"/>

したがって、上記のフィールドタイプの1つとしてフィールドにインデックスを付けると、そのフィールド名を使用してクエリを実行します(たとえばmyIntField:1234)。「正しいこと」を実行し、それに対して範囲検索を実行することもできます(myIntField:[1200 TO 1300])。フロートなども同様です。

于 2012-05-02T00:13:37.233 に答える
2

org.apache.lucene.document.NumericFieldクラスを活用できると思います。このクラスでは、setメソッドを呼び出すことができ、int、log、float、およびdoubleをサポートできます。他のデータ型(bool、datetimeなど)の場合、特別な変換を実行して、それらをint型またはlong型に変更できます。

ところで、私は新しいクラスを含むluceneの最新のソースコードを見ました:FloatField、IntField、LongField、DoubleField。次のリリースに含まれる予定です。 http://svn.apache.org/repos/asf/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/document/

于 2012-05-13T14:27:34.663 に答える