Поиск в спящем режиме (4.5) @Spatial as @IndexedEmbedded

У меня есть объект «Сообщение», который имеет отношение @OneToMany к списку (набору) «Местоположений» — пространственному объекту (сообщение может иметь много местоположений — см. ниже классы). Индекс создан правильно, как видно с Люком. Когда я пытаюсь создать составной запрос с двумя обязательными правилами, запрос возвращает запрошенное сообщение только тогда, когда указано одно из правильных местоположений. Это похоже на то, что 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(заданный заголовок) и .must вторым набором координат, я получаю класс в качестве ответа (хотя я хотел бы только конкретное местоположение, но это другой вопрос). Если я сделаю то же самое с другим местоположением (также присутствующим в индексе), я получу пустой ответ. Любые идеи??


person foxTox    schedule 07.03.2014    source источник


Ответы (1)


Поиск не дал никакого ответа, поэтому единственный способ сделать это в конце концов - сделать это наоборот.

Так что на самом деле я поменял местами @IndexedEmbedded и @ContainedIn , чтобы адрес индексированного объекта содержал сообщения. Я не знаю, не обеспечивает ли поиск индексацию для наборов пространственных объектов, или есть необходимость в конкретном @SpatialBridge , который выполняет итерацию по каждому набору координат.

person foxTox    schedule 10.03.2014