2012-03-13 13 views
0

Node.jsと石灰岩を使ってsphinxデータを取得しようとしました。私はスフィンクスからフロート値のすべてを得ました。私のSphinxインデックスでは、Heightは浮動小数点値( "sql_attr_float = Height")と定義されていますが、Node.jsは整数値を返します。SphinxでNode.jsを使用してfloat属性を取得する際の問題

例:スフィンクスでの高さの値が172.72であれば、その後、私はNode.jsの

から「1127004242」を得た。この上で私を助けてください。

以下

proto.toReader = function toReader() { 
    var offset = 0, length = this.length, buffer = this; 
    return { 
    empty: function empty() { 
     return offset >= length; 
    }, 
    int64: function shiftInt64() { 
     var hi_low_pair = buffer.int64Read(offset); 
     offset += 8; 
     return hi_low_pair; 
    }, 
    int32: function shiftInt32() { 
     var number = buffer.int32Read(offset); 
     offset += 4; 
     return number; 
    }, 
    int16: function shiftInt16() { 
     var number = buffer.int16Read(offset); 
     offset += 2; 
     return number; 
    }, 
    buffer: function shiftBuffer(length) { 
     var b = buffer.slice(offset, offset + length); 
     offset += length; 
     return b; 
    }, 
    string: function shiftString(length) { 
     var string = buffer.toString('utf8', offset, offset + length); 
     offset += length; 
     return string; 
    }, 
    cstring: function shiftCstring() { 
     var end = offset; 
     while (buffer[end] > 0 && end < length) { end++; } 
     var string = buffer.toString('utf8', offset, end); 
     offset = end + 1; 
     return string; 
    }, 
    lstring: function shiftLString() { 
     var length = buffer.int32Read(offset); 
     offset += 4;   

     if(!isNaN(length) && !isNaN(offset)){ 
     length = length; 
     var string = buffer.toString('utf8', offset, offset + length); 
     }else{ 
     var string = ""; 
     } 

     offset += length; 
     return string; 
    }, 
    multicstring: function shiftMulticstring() { 
     var fields = []; 
     while (buffer[offset] > 0) { 
     fields.push(this.cstring()); 
     } 
     offset++; 
     return fields; 
    }, 
    hash: function shiftHash() { 
     var hash = {}; 
     while (buffer[offset] > 0) { 
     hash[this.cstring()] = this.cstring(); 
     } 
     offset++; 
     return hash; 
    } 
    }; 
}; 

答えて

1

、スフィンクスのデータを読み込み、石灰岩のファイルで使用される機能ですうーん、 https://github.com/kurokikaze/limestone/blob/master/limestone.js のライン715は、だから、そのだけのint32型としてfloatを読ん

  // FLOAT size attributes (32 bits) 
      if (output.attributes[attribute].type == Sphinx.attribute.FLOAT) { 
       attr_value = response.int32(); 
       match.attrs[output.attributes[attribute].name] = attr_value; 
       continue; 
      } 

を持っています!

toReader/makeWriterにはfloatメソッドがありません。

その値を自分自身で解読する方法と、浮動小数点を直接扱うパッチ石灰岩のどちらかを解説するか、アプリケーションで自分自身で解読する必要があります。ややnativly

          /* handle floats */ 
              if (type==SPH_ATTR_FLOAT) 
              { 
                docInfo.attrValues.add (attrNumber, new Float (in.readFloat())); 
                continue; 
              } 

パックのポートの場合は/解凍

        // handle floats 
            if ($type==SPH_ATTR_FLOAT) 
            { 
              list(,$uval) = unpack ("N*", substr ($response, $p, 4)); $p += 4; 
              list(,$fval) = unpack ("f*", pack ("L", $uval)); 
              $attrvals[$attr] = $fval; 
              continue; 
            } 

Javaがそれを行うことができます:SphinxAPIコードを確認する

が、これはPHPで行う方法です pack/unpack functions for node.js

関連する問題