1. ホーム
  2. エラスチックサーチ

Elasticsearch 5.Xで集計する際、テキストフィールドのFielddataはデフォルトで無効化されます。

2022-03-16 20:36:21

Elasticsearch 5.X 集約操作の例外です。 フィールドデータは、デフォルトでテキストフィールドでは無効になっています。を読み込むには、[color]にfielddata=trueを設定します。

 フィールドデータをメモリ上で反転させる。しかし、これはかなりのメモリを消費することになる。

Fielddataはデフォルトでテキストフィールドを無効にします。これはFielddataがヒープスペースを大量に消費するためで、特に高基準のテキストフィールドをロードするときに顕著です。いったんフィールドデータがロードされると をヒープに入れると、セグメントの有効期間中、そのヒープに留まります。さらに、フィールドデータの読み込みは、ユーザーエクスペリエンスに遅延をもたらす高価な処理です。上記のバグは、次のように処理することができます。

1. このmy_field.keywordフィールドは、集計、ソート、スクリプトに使用することができます

2、フィールドデータを有効にする(推奨しない)



フィールドデータの説明

ほとんどの分野 デフォルト インデックス で、検索可能になります。 しかし、スクリプトでフィールドの値をソート、集約、アクセスするには、検索とは異なるアクセスパターンが必要です。

検索には、質問に答えることが必要です。 この用語を含むファイルはどれですか?  一方、ソートやアグリゲーションは別の質問に答える必要があります。 この ドキュメント 対象 この ドキュメントに記載されている内容 ?"  .

ほとんどのフィールドで、インデックスタイム、オンディスクを使用可能 QT += serialport このデータアクセスパターンですが foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { QSerialPort serial; serial.setPort(info); if (serial.open(QIODevice::ReadWrite)) { portList.push_back(serial.portName()); serial.close(); } } このフィールドは、以下をサポートしていません。 void frmserialport::initialSerialPort() //initialize the serial port (serial port number, baud rate, data bits, stop bits, stream control) { m_flag = 0; QList<QString> portList; QStringList baudList; QStringList parityList; QStringList dataBitList; QStringList stopBitList; QStringList flowList; baudList<<"9600"<<"115200"<<"460800"; dataBitList<<"8"; parityList<<"none"; stopBitList<<"1"; flowList<<"none"; } void frmserialport::on_btn_Open_clicked() //open the serial port { m_pSerialPort = new QSerialPort(this); m_pSerialPort->setPortName(ui->cbox_PortName->currentText()); //serial port name m_pSerialPort->setBaudRate(ui->cbox_BaudRate->currentText().toInt()); // baud rate switch (ui->cbox_DataBit->currentIndex()) { case 0: m_pSerialPort->setDataBits(QSerialPort::Data8); // data bits are 8 bits break; default: break; } switch (ui->cbox_Parity->currentIndex()) { case 0: m_pSerialPort->setParity(QSerialPort::NoParity); //no check digit break; default: break; } switch (ui->cbox_StopBit->currentIndex()) { case 0: m_pSerialPort->setStopBits(QSerialPort::OneStop); //one stop bit break; default: break; } switch (ui->cbox_Flow->currentIndex()) { case 0: m_pSerialPort->setFlowControl(QSerialPort::NoFlowControl); //no flow control break; default: break; } if (!m_pSerialPort->open(QIODevice::ReadWrite)){ QMessageBox::information(this,"prompt","Serial port connection failed"); } else{ QMessageBox::information(this,"prompt",ui->cbox_PortName->currentText() + tr("connection successful")); ui->btn_Open->setEnabled(false); ui->btn_Close->setEnabled(true); ui->btn_Send->setEnabled(true); } connect(m_pSerialPort,&QSerialPort::readyRead,this,&frmserialport::serialReadData); .

逆に void frmserialport::on_btn_Send_clicked() //Send data { QString strMessage = ui->txt_Send->toPlainText(); sendCMD(strMessage); } void frmserialport::on_btn_Clear_clicked() //clear { if (!ui->txt_Receive->toPlainText().isEmpty()){ ui->txt_Receive->clear(); ui->btn_Clear->setEnabled(false); } } フィールド名は "オンクエリ のメモリ"を使用します。 データ構造  void frmserialport::on_btn_Close_clicked() //close the serial port { m_pSerialPort->clear(); m_pSerialPort->close(); delete m_pSerialPort; m_pSerialPort = nullptr; m_flag = 0; ui->btn_Open->setEnabled(true); ui->btn_Close->setEnabled(false); ui->btn_Send->setEnabled(false); } . このデータ構造は、フィールドが集計、ソート、スクリプトのために初めて使用されるときに構築される。 ディスクから各セグメントの完全転置インデックスを読み出し、用語↔︎文書の関係を転置し、その結果をメモリ上のJVMヒープに格納することで構築される。

Fielddataは // Plot variables and coordinates QDateTimeAxis *axisX_aX; //use time for x-axis QDateTimeAxis *axisX_aY; QDateTimeAxis *axisX_aZ; QValueAxis *axisY_aX; //aX data, representing the y-axis QValueAxis *axisY_aY; //aY data QValueAxis *axisY_aZ; //aZ data QTimer *timer; //chart's timer QChart *chart; QSplineSeries *series_aX; //data points QSplineSeries *series_aY; QSplineSeries *series_aZ; デフォルト 編集 フィールド は無効になります。

Fielddataは、以下のものを消費することができます。 大量の を読み込むと、特にヒープスペースの大きな axisX_aX->setFormat("hh:mm:ss"); axisY_aX->setRange(-3,3); chart->addSeries(series_aX); axisX_aX->setTickCount(10); axisY_aX->setTickCount(10); axisX_aX->setTitleText("Real Time"); axisY_aX->setTitleText("Acceleration A(G):"); series_aX->setPen(QColor(Qt::red)); axisY_aX->setLinePen(peny); axisX_aX->setLinePen(peny); chart->addAxis(axisX_aX , Qt::AlignBottom); chart->addAxis(axisY_aX , Qt::AlignLeft); series_aX->attachAxis(axisX_aX); series_aX->attachAxis(axisY_aX); QDateTime currentTime = QDateTime::currentDateTime(); //realtime chart->axisX()->setMin(QDateTime::currentDateTime().addSecs(-60*1)); chart->axisX()->setMax(QDateTime::currentDateTime().addMSecs(0)); qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); series_aX->append(currentTime.toMSecsSinceEpoch() , aX); //provide x,y axis data フィールドのとき。 一旦フィールドデータがヒープにロードされると、セグメントの存続期間中はそこに留まります。 また、フィールドデータの読み込みは高価な処理であり、ユーザーエクスペリエンスに遅延をもたらす可能性があります。 そのため、fielddataはデフォルトで無効化されています。

を変更しようとした場合 //connect(timer,SIGNAL(timeout()),this,SLOT(RealtimeDataSlot())); slot function before accepting data without delay connect(timer,SIGNAL(timeout()),this,SLOT(DrawLine()))); //connect(m_pSerialPort,&QSerialPort::readyRead,this,&frmserialport::serialReadData); //slot function before receiving data without delay //delayed data reception connect(m_pSerialPort,SIGNAL(readyRead()),this,SLOT(on_serialReadData())); //when there is data coming is displayed connect(&timer1,SIGNAL(timeout()),this,SLOT(serialReadData())); //enter when timing is over  フィールド のスクリプトで値をソート、集約、アクセスする。 を実行すると、次のような例外が発生します。

<ブロッククオート

Fielddataはデフォルトでテキストフィールドを無効にしています。 QByteArray receiveData; receiveData = m_pSerialPort->readAll(); qDebug()<<"Re:"<<<receiveData; QString str=receiveData; int x1=str.indexOf("":"); int x=str.indexOf("G"); int x2=x-x1-1; で[.  your_field_name オン 設定 を使用すると、インデックスをアンインバートしてインメモリフィールドデータをロードすることができます。 この場合、多くのメモリを使用する可能性があることに注意してください。

フィールドデータ有効化後  編集する

fielddata を有効にする前に、なぜ text フィールドは集計、ソート、スクリプトのいずれかになります。 これは通常、意味をなさない。

にインデックスする前にテキストフィールドを解析する。 New York で検索 new または 検索して探す の類似値  york . terms  このフィールドに を集約すると new バケツと york を呼び出すバケツが必要な場合、そのバケツは New York .

その代わりに text 全文検索用 フィールドと  集計を有効にした場合 未解析 keyword フィールド doc_values というもので、このようになります。

PUT my_index 
{ 
  "mappings": { 
    "my_type": { 
      "properties": { 
        "my_field": {



          "type": "text".
          "fields": { 
            "keyword": {



              "type": "keyword" 
            } 
          } 
        } 
      } 
    } 
  } 
}

<テーブル

<イグ

使用方法 my_field 検索するフィールド。

<イグ

使用方法 my_field.keyword 集計、ソート、スクリプトを行うフィールド。

text フィールド フィールドデータを有効にする 編集

できること text 使用方法 PUTマッピングAPI 既存の フィールド  フィールドデータを有効にする  を以下のように設定します。

PUT my_index / _mapping / my_type 
{ 
  "properties": { 
    "my_field": {



      "type": "text".
      "fielddata": true 
    } 
  } 
}




<テーブル

<イグ

指定したマッピング my_field は、そのフィールドの既存のマッピングによって定義されるべきであり fielddata パラメータを構成する。

fielddata.* パラメータは、同じインデックスの同じ名前のフィールドに設定する必要があります。 その値を設定するには PUT Mapping API 既存フィールドの更新 .

Javaコードの実装

String index = "cars";
String type = "transactions";
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index).setTypes(type);
TermsAggregationBuilder field = AggregationBuilders.terms("popular_colors").field("color.keyword");
searchRequestBuilder.addAggregation(field);
searchRequestBuilder.setSize(0);
SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
System.out.println(searchResponse.toString());





参照用アドレスです。 https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html#field-data-filtering