Ciao, 我无法使用Spring Solr数据获得以下solr查询。
q=name:rsa&sfield=坐标&pt=-8.506854,115.262478&sort=geodist((%20asc
如果我将其放入 solr 管理控制台,该查询有效,但它不适用于 spring solr 数据。我在文档中找不到有关地理学家排序的示例,因此我创建了一个具有以下功能的自定义存储库:
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 不喜欢这个字符 ((。这是错误:
; 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.
如何使用弹簧溶胶数据按大地地理函数排序?
谢谢。
我在这里找到了一个解决方案 SOLR 弹簧数据地理空间查询
@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"属性,用于存储由geodist函数计算的距离值。
@Score
private Double score;
这个解决方案有效,但我知道有一种更好的方法实际上对我来说不起作用,请参阅此链接。我会继续调查它。
如何使用弹簧数据索尔在空间搜索中返回距离和分数