「場所」のリスト (セット) と @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 番目の座標セットを使用してメッセージ クラスをクエリすると、応答としてクラスが取得されます (特定の場所のみが必要ですが、これは別の質問です)。別の場所(インデックスにも存在する)で同じことを行うと、空の応答が返されます。何か案は??