Как отсортировать по функции geodist() в Spring Solr Data?

Ciao, я не могу получить следующий запрос solr, работающий с данными Spring Solr.

q = имя:rsa& sfield = координаты &pt=-8.506854,115.262478&sort=geodist()%20asc

Запрос работает, если я помещаю его в консоль администратора Solr, но он не работает с данными Spring Solr. В документации не было примеров сортировки геодистов, поэтому я создал CustomRepository со следующей функцией:

public Page<StructureDocument> findStructuresByNameAndCoordinates(String value, Point point, Pageable page) {

StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("name:*").append(value).append("*");
queryBuilder.append("&sfield=coordinates");
queryBuilder.append("&pt=").append(point.getX()).append(",").append(point.getY());
queryBuilder.append("&sort=geodist() asc");

Query query = new SimpleQuery(new SimpleStringCriteria(queryBuilder.toString())).setPageRequest(page);  

Но это не работает из-за синтаксической ошибки (кажется, что Solrj не нравится этот chars (). Это ошибка:

; nested exception is org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://localhost:8983/solr: org.apache.solr.search.SyntaxError: Cannot parse 'name:*francesco*&sfield=coordinates&pt=-8.506854,115.262478&sort=geodist() asc': Encountered " ")" ") "" at line 1, column 71.

Как я могу отсортировать по функции геодиста с данными Spring Solr?

Большое спасибо.

1 ответ

Я нашел решение здесь SOLR Spring Data геопространственный запрос

@Override
public Page<StructureDocument> 
findStructuresByNameAndCoordinates(String value, Point point, Pageable 
page){
SimpleQuery query = new SimpleQuery().setPageRequest(page);
query.addProjectionOnField("*");
query.addProjectionOnField("score");

StringBuffer buf = new StringBuffer("");
buf.append("{!geofilt pt=");
buf.append(point.getX());
buf.append(",");
buf.append(point.getY());
buf.append(" sfield=coordinates d=");
buf.append(2000.0);
buf.append(" score=distance}");

query.addCriteria(new SimpleStringCriteria(buf.toString()));

FilterQuery searchTerm = new SimpleFilterQuery();
searchTerm.addCriteria(new Criteria("name").contains(value));
query.addFilterQuery(searchTerm);

query.addSort(new Sort(Sort.Direction.ASC, "score"));

Кроме того, я добавил в свой документ solr атрибут "Score", используемый для хранения значения расстояния, вычисленного функцией геодиста.

@Score
private Double score;

Это решение работает, но я знаю, что есть лучший способ, который на самом деле для меня не работает, см. Эту ссылку. Я продолжу исследовать это.

Как вернуть расстояние и оценку в пространственном поиске, используя spring-data-solr

Другие вопросы по тегам