स्प्रिंग-डेटा-सोलर का उपयोग करके स्थानिक खोज में दूरी और स्कोर कैसे वापस करें

मैं स्प्रिंग-डेटा-सोलर 1.0.0 का उपयोग कर स्प्रिंग एमवीसी आधारित सर्च एपीआई लिख रहा हूं। सोलर 4.4.0 और स्प्रिंग 3.2.4.RELEASE के साथ।

मैं बुनियादी प्रश्नों को चलाने में सक्षम हूं लेकिन किसी भी अच्छे उदाहरण को खोजने में असमर्थ हूं, मैं परिणामों में स्कोर और दूरी: geodist() कैसे लौटा सकता हूं।

मुझे पता है कि मैं क्वेरी का उपयोग कर सोलर से परिणाम प्राप्त कर सकता हूं

http://localhost:8983/solr/events/select?q=*:*&spatial=true&pt=51.435872%2C-0.427529&sfield=position&d=20&facet=true&facet.mincount=1&facet.limit=-1&facet.field=categoryIds&fl=score,*,distance:geodist()&sort=geodist()+asc

लेकिन मुझे नहीं पता कि स्प्रिंग-डेटा-सोलर का उपयोग करके सोलर से स्कोर और दूरी गुण वापस कैसे प्राप्त करें। मैंने कोड का पालन करने की कोशिश की है

FacetQuery search = new SimpleFacetQuery();

Criteria conditions;// = new Criteria();
if(StringUtils.isNotBlank(searchCriteria.getSearchString()))
        conditions = new Criteria(EventDocument.FIELD_EVENT).contains(searchCriteria.getSearchString());

if(searchCriteria.isLocationKnown()){
        conditions.and(new Criteria(EventDocument.FIELD_POSITION).within(new GeoLocation(searchCriteria.getLatitude(), searchCriteria.getLongitude()), new Distance(searchCriteria.getDistance(), Distance.Unit.MILES)));
        conditions.and(new Criteria(CommonParams.FL).is("score,distance:geodist(),*"));
    } else{
        conditions.and(new Criteria(CommonParams.FL).is("score,*"));
    }

search.addCriteria(conditions);
FacetPage page = solrTemplate.queryForFacetPage(search, EventDocument.class);

लेकिन निम्नलिखित अपवाद प्राप्त करना:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.data.solr.UncategorizedSolrException: undefined field fl; nested exception is org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: undefined field fl
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
root cause

org.springframework.data.solr.UncategorizedSolrException: undefined field fl; nested exception is org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: undefined field fl
org.springframework.data.solr.core.SolrTemplate.execute(SolrTemplate.java:122)
org.springframework.data.solr.core.SolrTemplate.executeSolrQuery(SolrTemplate.java:330)
org.springframework.data.solr.core.SolrTemplate.query(SolrTemplate.java:326)
org.springframework.data.solr.core.SolrTemplate.queryForFacetPage(SolrTemplate.java:285)
com.johnstonpress.api.repository.EventDocumentRepositoryImpl.search(EventDocumentRepositoryImpl.java:72)
com.johnstonpress.api.service.SearchEventServiceImpl.search(SearchEventServiceImpl.java:106)
com.johnstonpress.api.controller.EventsSearchController.searchEvents(EventsSearchController.java:124)
com.johnstonpress.api.controller.EventsSearchController.search(EventsSearchController.java:68)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

किसी भी ध्यान और मदद के लिए धन्यवाद !!!

4

1 उत्तर

fl सेट करने के लिए आपको query.addProjectionOnField (स्ट्रिंग फ़ील्डनाम) का उपयोग करना होगा।

    SimpleQuery query = new SimpleQuery(conditions);
    query.addProjectionOnField("*");
    query.addProjectionOnField("score");

score को EventDocument में मैपिंग के लिए आपको निम्नानुसार संपत्ति जोड़नी होगी।

    @Indexed(value = "score", readonly = true)
    private Float score;

दुर्भाग्य से geodist() के साथ कोई समस्या प्रतीत होती है जो वसंत डेटा सोलर स्थानिक क्वेरी बनाता है। उस के लिए DATASOLR-130 का विरोध किया गया।


स्थानिक पैरामीटर स्वयं को सेट करके SolrTemplate के साथ SolrCallback के साथ दूरी का अनुरोध किया जा सकता है।

    SimpleQuery query = new SimpleQuery(conditions);
    query.addProjectionOnField("*");
    query.addProjectionOnField("distance:geodist()");

    DefaultQueryParser qp = new DefaultQueryParser();
    final SolrQuery solrQuery = qp.constructSolrQuery(query);
    solrQuery.add("sfield", "store");
    solrQuery.add("pt", GeoConverters.GeoLocationToStringConverter.INSTANCE.convert(new GeoLocation(45.15, -93.85)));
    solrQuery.add("d", GeoConverters.DistanceToStringConverter.INSTANCE.convert(new Distance(5)));

    List result = template.execute(new SolrCallback>() {

      @Override
      public List doInSolr(SolrServer solrServer) throws SolrServerException, IOException {
        return template.getConverter().read(solrServer.query(solrQuery).getResults(), EventDocument.class);
      }
    });

geodist() के लिए आवश्यक पैरामीटर प्रदान करना थोड़ा आसान होगा।

    SimpleQuery query = new SimpleQuery(conditions);
    query.addProjectionOnField("*");
    query.addProjectionOnField("distance:geodist(store," + GeoConverters.GeoLocationToStringConverter.INSTANCE.convert(new GeoLocation(45.15, -93.85)) + ")");
    Page result = template.queryForPage(query, EventDocument.class);

उम्मीद है की वो मदद करदे!

6
जोड़ा
जल्दी के लिए @ क्रिस्टोफ-स्ट्रब्लू धन्यवाद, मैं इसे आज़मा दूंगा और जवाब दूंगा। इस बीच, क्या आप geodist() के लिए किसी भी वैकल्पिक के बारे में सोच सकते हैं? अन्यथा मुझे वैकल्पिक विकल्प के रूप में वसंत-डेटा-सोलर से सोल्रज तक स्विच करना होगा। कोई भी सूचक मदद करेगा।
जोड़ा लेखक Aamir Yaseen, स्रोत
हाय @ क्रिस्टोफ-स्ट्रोबल मैंने आपके सुझाव की कोशिश की है और मैं हां addProjectionOnField geodist() को छोड़कर ठीक काम कर रहा है। मेरे आवेदन के लिए दूरी से छंटनी महत्वपूर्ण है। क्या दूरी से सॉर्ट करने के लिए कोई वैकल्पिक विकल्प उपलब्ध है या आप इस समस्या को हल किए जाने तक इस एपीआई को नहीं कर सकते हैं? पीएस: अगर यह वसंत डेटा सोलर के बारे में प्रश्न पूछने के लिए सबसे अच्छी जगह नहीं है, तो क्या आप मुझे किसी भी मंच पर इंगित कर सकते हैं जहां मैं कुछ और संबंधित/समान प्रश्न पूछ सकता हूं?
जोड़ा लेखक Aamir Yaseen, स्रोत
बहुत बहुत धन्यवाद @ क्रिस्टोफ-स्ट्रब्ल, बहुत उपयोगी जानकारी और मेरी समस्या हल करती है। query.addProjectionOnField ("दूरी: geodist (store," + GeoConverters.GeoLocationToStringConverter.INSTANCE.convert (& zwnj; नया भू-स्थान (45.15, -93.85)) + ")"); मेरी समस्या हल
जोड़ा लेखक Aamir Yaseen, स्रोत
हाय @ आमिर-यासीन, स्टैक ओवरफ्लो पूछने के लिए एक अच्छी जगह है, आप वसंत भी आज़मा सकते हैं आईओ फोरम । मैंने अभी ऊपर अपना जवाब संपादित किया है और उम्मीद है कि आपको यह उपयोगी लगेगा।
जोड़ा लेखक Christoph Strobl, स्रोत