1

私はelasticSearchでSpringデータをテストしています。ES サーバーは、同じ部屋のリモート サーバーで実行されています。

エイリアスの下に、1 日に 1 つのインデックスを作成しています。シンプルなツイートを探しています。しかし、 a を試してみると、findOne()常に が返されるため、うまくいかないようですnull

また、findAll(ids)エイリアスを使用しているため機能しませんが、ドキュメントでこれを処理する方法が見つかりません。

何を達成したいですか?

さしあたっては、指定されたid_str.
count メソッドは機能しますが、findOne は機能しません

ここに私の質問が
あります 動作 させるにはどうすればよいfindOne()ですか?
このエイリアスで複数のインデックスを検索するには、どの方法を使用すればよいですか?

ESでデータがどのように見えるかを次に示します

{
    "id_str" : "135131315100051",
    "..." : "...",
    "user" : {
        "id_str" : "15843643228"
        "..." : "..."
    }
}

私のモデル

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

@Document(indexName = "alias", type = "tweets")
public class Tweet
{
    @Id
    @Field(type = FieldType.String)
    private String idStr;

    public String getIdStr()
    {
        return idStr;
    }

    public void setIdStr(final String idStr)
    {
        this.idStr = idStr;
    }

    @Override
    public String toString()
    {
        return "{ id_str : " + idStr + " }";
    }
}

エイリアスはalias、インデックスはalias_dd-mm-yyyy

私のリポジトリ

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import com.thales.communications.osintlab.bigdata.webservices.models.Tweet;

public interface EsTweetRepository extends ElasticsearchRepository<Tweet, String>
{
    Tweet findByIdStr(String idStr);
}

私のテスト

    @Test
    public void shouldReturnATweet()
    {

        //lets try to search same record in elasticsearch
        final Tweet tweet1 = tweetRepository.findOne("593768150975512576");
        //final Tweet tweet = tweetRepository.findByIdStr("593897683661824000");
        System.out.println("Count is " + tweet1);
        //System.out.println("Count is " + tweetRepository.count());
        //      System.out.println(tweet.toString());
    }

もちろん、テスト済みの ID を持つツイートは存在します :)。そして、count()正常に動作しています。

ご協力いただきありがとうございます


編集

これが私が持っているもののサンプルアプリケーションです: https://github.com/ogdabou/es-stackoverflow-sample

spring-data-elasticsearch は、フィールド「id_str」ではなく、フィールド「_id」を探しているようです。メソッドの解析が原因かもしれません(そこを見ください)。json の「id_str」属性を idStr Java モデルにバインドする方法を探しています。

4

1 に答える 1

3

本当の問題は何だったのか

_idtwitter で指定されたフィールドを使用して、Elasticsearch でツイートのフィールドを設定しますid。しかし、それは別の形式で保存されます (たとえば、132 は 1.32E2 になります)
私が行くとき、必要なものではなく、Elasticsearch フィールドとfindOne()の一致を検索しています。_idid_str

解決

そこには、2 つのコミットがあります。1 つ目は問題、2 つ目は解決策です。

新しいリポジトリ

public interface EsTweetRepository extends ElasticsearchRepository<Tweet, String>
{
    @Query("{\"bool\" : {\"must\" : {\"term\" : {\"id_str\" : \"?0\"}}}}")
    Tweet findByIdStr(String idStr);
}

モデル

@Document(indexName = "my_index_01", type = "tweets")
public class Tweet
{
    // Elasticsearch object internal id. Look at field "_id"
    @Id
    private String id;

    // Twitter internal id, saved under the "id_str" field
    @Field(type = FieldType.String)
    private String id_str;

    @Field(type = FieldType.String)
    private String text;

    public String getId_str()
    {
        return id_str;
    }

    public void setId_str(final String id_str)
    {
        this.id_str = id_str;
    }

    public String getText()
    {
        return text;
    }

    public void setText(final String text)
    {
        this.text = text;
    }

    public String getId()
    {
        return id;
    }

    public void setId(final String id)
    {
        this.id = id;
    }

    @Override
    public String toString()
    {
        return "{ _id : " + id + ", id_str :  " + id_str + ", text : " + text + " }";
    }
}
于 2015-05-20T09:42:01.173 に答える