4

ElasticSearch の _plugin/head インターフェイスを使用してクエリを作成できました。このクエリは、特定の場所にある特定のデバイスの最新のタイムスタンプを返すことを目的としています。クエリは次のようになります。

{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "term":{  
                  "deviceevent.location.id":"1"
               }
            },
            {  
               "term":{  
                  "deviceevent.deviceId":"AHE1LDD01"
               }
            }
         ]
      }
   },
   "from":0,
   "size":1,
   "sort":{  
      "timestamp":{  
         "order":"desc"
      }
   }
}

上記のクエリは意図したとおりに機能します。Spring-Boot と Spring-Data-ElasticSearch を使用しElasticSearchRepositoryて、次のように独自に定義しました。

package com.repository.elasticsearch;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import com.domain.DeviceEvent;

public interface DeviceEventRepository extends ElasticsearchRepository<DeviceEvent, String>
{
    @Query("{\"bool\":{\"must\":[{\"term\":{\"deviceevent.location.id\": \"?0\"}},{\"term\":{\"deviceevent.deviceId\": \"?1\"}}]}},\"from\": 0,\"size\": 1,\"sort\":{\"timestamp\":{\"order\":\"desc\"}}")
    DeviceEvent findLatestCheckInAtLocation(Long locationId, String deviceId);
}

上記のコードは主に one を返すと予想されるため壊れていますがDeviceEvent、実際には count = 10 (デフォルトのページ サイズ) のデバイス イベントを返しています。また、結果がタイムスタンプの降順で並べられていないようです。クエリのsizeandorder部分が取得されていないかのようです。

ここで何が間違っていますか?

4

1 に答える 1

8

クエリ アノテーションで結果のサイズを制御する代わりに。

Pageable インターフェースを使用してください。以下はドキュメントから抜粋したものです。

public interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("{"bool" : {"must" : {"field" : {"name" : "?0"}}}}")
    Page<Book> findByName(String name,Pageable pageable);
}

これにより、次のことが可能になります。

findByName("foo-name", new PageRequest(0,1));

あなたもソートしたい場合:

findByName("foo-name", new PageRequest(0,1, new Sort(new Sort.Order(Sort.Direction.ASC,"name")))).getContent().get(0);
于 2015-03-01T21:46:19.797 に答える