我有一个实体“消息”,它与列表(Set)的“位置”有一个@OneToMany关系 - 一个空间实体(一条消息可能有很多位置 - 见于类下面)。正确创建索引,如Luke所示。 当我尝试创建具有两个“必须”规则的复合查询时,查询仅在给出其中一个正确位置时才返回所请求的消息。这就像onDefaultCoordinates()只占用列表中的一个位置。这是有道理的,但我不能使用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(给定标题)查询消息类并且必须使用第二组坐标时,我将该类作为响应(尽管我只想要特定位置,但这是一个不同的问题)。如果我用不同的位置(也存在于索引中)做同样的事情,我得到一个空的响应。 任何想法??
答案 0 :(得分:0)
搜索没有提供任何答案,所以最终做到这一点的唯一方法就是反过来做..
所以实际上我已经切换了 @IndexedEmbedded
和 @ContainedIn
的位置,以便索引实体Address包含消息。我不知道Search是否不为空间实体集提供索引,或者需要一个遍历每组坐标的特定 @SpatialBridge
。