0

「場所」のリスト (セット) と @OneToMany の関係を持つエンティティ「メッセージ」があります - 空間エンティティ (メッセージには多くの場所がある場合があります -- 以下のクラスを参照してください)。Luke で見られるように、インデックスは正しく作成されています。2 つの「必須」ルールを持つ複合クエリを作成しようとすると、正しい場所の 1 つが指定された場合にのみ、クエリは要求されたメッセージを返します。onDefaultCoordinates() がリスト内の場所の 1 つだけを取るようなものです。理にかなっていますが、座標の各セットの名前を持つリストを作成できないため、 onCoordinates(String arg) を使用できません。クエリは次のとおりです。

org.apache.lucene.search.Query luceneQuery = builder.bool()
  .must( builder.keyword().onField("title").matching(text).createQuery() )
  .must( builder.spatial().onDefaultCoordinates().within(5, Unit.KM)
    .ofLatitude(location.getLatitude()).andLongitude(location.getLongitude())
    .createQuery() )
  .createQuery();

クラスは次のとおりです。

//Message class
@Entity
@Indexed
public class Message {

private int id;
private String title;
private String content;

private Set<Location> locations;

@OneToMany(mappedBy="message", fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@IndexedEmbedded
public Set<Location> getLocations(){
  return locations;
}

// Rest of the getters/setters

および場所クラス:

// Location class, @latitude, @longitude, omitted here, set at the getters 
@Spatial (spatialMode = SpatialMode.GRID)
@Indexed
@Entity
public class Location {

private int id;
private String name;
private double latitude;
private double longitude;
private Message message;

@JsonBackReference  // used in REST response -- irrelevant here
@ContainedIn
@ManyToOne
public Message getMessage() {
  return message;
}

// Rest of the getters/setters

.must(指定されたタイトル) と .must の 2 番目の座標セットを使用してメッセージ クラスをクエリすると、応答としてクラスが取得されます (特定の場所のみが必要ですが、これは別の質問です)。別の場所(インデックスにも存在する)で同じことを行うと、空の応答が返されます。何か案は??

4

1 に答える 1

0

検索しても答えが得られなかったので、最終的にそれを行う唯一の方法は、逆の方法で行うことです..

したがって、実際には、インデックス付きエンティティ Address にメッセージが含まれるようにするために、 @IndexedEmbedded との場所を入れ替えました。 @ContainedIn 検索が空間エンティティのセットへのインデックス作成を提供しないかどうか、または @SpatialBridge 座標のすべてのセットを反復処理する特定の必要があるかどうかはわかりません。

于 2014-03-10T11:46:46.207 に答える