Re: SolrJ Collapsable Query Fails
Hi, Thanks for the code, snippet, it was very useful, however, can you please include a very small description of certain unknown variables such as 'groupedInfo', 'ResultItem', 'searcher', 'fields' and the method 'solrDocumentToResultItem'? Thanks On Sat, Jul 16, 2011 at 3:36 PM, Kurt Sultana wrote: > > Thanks for the information. However, I still have one more > > problem. I am > > iterating over the values of the NamedList. I have 2 > > values, one > > being 'responseHeader' and the other one being 'grouped'. I > > would like to > > access some information stored within the grouped section, > > which has > > data structured like so: > > > > > grouped={attr_directory={matches=4,groups=[{groupValue=C:\Users\rvassallo\Desktop\Index,doclist={numFound=2,start=0,docs=[SolrDocument[{attr_meta=[Author, > > kcook, Last-Modified, 2011-03-02T14:14:18Z... > > > > With the 'get("group")' method I am only able to access the > > entire > > '{attr_directory={matches=4,g...' section. Is there some > > functionality which > > allows me to get other data? Something like this for > > instance: > > 'get("group.matches")' or maybe > > 'get(group.attr_directory.matches)' (which > > will yield the value of 4), or do I need to process the > > String that the > > 'get("...")' returns to get what I need? > > > > Thanks :) > > I think accessing the relevant portion in a NamedList is troublesome. I > suggest you to look at existing codes in solrJ. e.g. How facet info is > extracted from NamedList. > > I am sending you the piece of code that I used to access grouped info. > Hopefully It can give you some idea. > > NamedList signature = (NamedList) groupedInfo.get("attr_directory"); > >if (signature == null) return new ArrayList(0); > >matches.append(signature.get("matches")); > > >@SuppressWarnings("unchecked") >ArrayList groups = (ArrayList) > signature.get("groups"); > >ArrayList<> resultItems = new ArrayList<>(groups.size()); > >StringBuilder builder = new StringBuilder(); > > >for (NamedList res : groups) { > > ResultItem resultItem = null; > > String hash = null; > Integer found = null; > for (int i = 0; i < res.size(); i++) { >String n = res.getName(i); > >Object o = res.getVal(i); > >if ("groupValue".equals(n)) { > hash = (String) o; >} else if ("doclist".equals(n)) { > DocList docList = (DocList) o; > found = docList.matches(); > > try { >final SolrDocumentList list = > SolrPluginUtils.docListToSolrDocumentList(docList, searcher, fields, null); >builder.setLength(0); > >if (list.size() > 0) > resultItem = solrDocumentToResultItem(list.get(0), debug); > >for (final SolrDocument document : list) > builder.append(document.getFieldValue("id")).append(','); > > > } catch (final IOException e) { >LOG.error("Unexpected Error", e); > } >} > > > } > > if (found != null && found > 1 && resultItem != null) { >resultItem.setHash(hash); >resultItem.setFound(found); >builder.setLength(builder.length() - 1); >resultItem.setId(builder.toString()); > } > > // debug > > > resultItems.add(resultItem); >} > >return resultItems; > >
Re: SolrJ Collapsable Query Fails
Hi, Thanks for the information. However, I still have one more problem. I am iterating over the values of the NamedList. I have 2 values, one being 'responseHeader' and the other one being 'grouped'. I would like to access some information stored within the grouped section, which has data structured like so: grouped={attr_directory={matches=4,groups=[{groupValue=C:\Users\rvassallo\Desktop\Index,doclist={numFound=2,start=0,docs=[SolrDocument[{attr_meta=[Author, kcook, Last-Modified, 2011-03-02T14:14:18Z... With the 'get("group")' method I am only able to access the entire '{attr_directory={matches=4,g...' section. Is there some functionality which allows me to get other data? Something like this for instance: 'get("group.matches")' or maybe 'get(group.attr_directory.matches)' (which will yield the value of 4), or do I need to process the String that the 'get("...")' returns to get what I need? Thanks :) On Thu, Jul 14, 2011 at 12:52 PM, Ahmet Arslan wrote: > > See the Yonik's reply : http://search-lucene.com/m/tCmky1v94D92/ > > In short you need to use NamedList getResponse(). > > > I am currently trying to run a > > collapsable query using SolrJ using SolR 3.3. > > The problem is that when I run the query through the web > > interface, with > > this url: > > > > > http://localhost:8080/solr/select/?q=attr_content%3Alynx&sort=attr_location+desc&group=true&group.field=attr_directory > > > > I am able to see the XML which is returned. The problem > > though, is that when > > I try to run the same query through SolrJ, using this > > code: > > > > SolrQuery queryString = new > > SolrQuery(); > > > > for (String param : > > query.keySet()) > > > > { > > if > > (param.equals("fq")) > > > > { > > > > queryString.addFilterQuery(query.get(param)); > > > > } > > else > > { > > > > queryString.setParam(param, query.get(param)); > > > > } > > } > > > > > > System.out.println(queryString.toString()); > > > > QueryResponse response = > > server.query(queryString); > > //Exception takes place at this line > > > > SolrDocumentList docList = > > response.getResults(); > > > > Which constructs a URL like so: > > > > > q=attr_content%3Alynx&sort=attr_location+desc&group=true&group.field=attr_directory > > > > This throws an exception: > > > > Caused by: org.apache.solr.common.SolrException: parsing > > error at > > > org.apache.solr.client.solrj.impl.XMLResponseParser.processResponse(XMLResponseParser.java:145) > > at > > > org.apache.solr.client.solrj.impl.XMLResponseParser.processResponse(XMLResponseParser.java:106) > > at > > > org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:477) > > at > > > org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:244) > > at > > > org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:89) > > ... 3 more Caused by: javax.xml.stream.XMLStreamException: > > ParseError at > > [row,col]:[3,30088] Message: error reading value:LST at > > > org.apache.solr.client.solrj.impl.XMLResponseParser.readArray(XMLResponseParser.java:324) > > at > > > org.apache.solr.client.solrj.impl.XMLResponseParser.readNamedList(XMLResponseParser.java:245) > > at > > > org.apache.solr.client.solrj.impl.XMLResponseParser.readNamedList(XMLResponseParser.java:244) > > at > > > org.apache.solr.client.solrj.impl.XMLResponseParser.readNamedList(XMLResponseParser.java:244) > > at > > > org.apache.solr.client.solrj.impl.XMLResponseParser.processResponse(XMLResponseParser.java:130) > > > > I have tried it with both Jetty and Tomcat, the error is > > the same for both. > > I have managed to get other queries to run (with both > > servers), so I presume > > that the problem lies with this particular type of query. > > > > Any insight on this problem will be highly appreciated, > > > > Thanks :) > > >
SolrJ Collapsable Query Fails
I am currently trying to run a collapsable query using SolrJ using SolR 3.3. The problem is that when I run the query through the web interface, with this url: http://localhost:8080/solr/select/?q=attr_content%3Alynx&sort=attr_location+desc&group=true&group.field=attr_directory I am able to see the XML which is returned. The problem though, is that when I try to run the same query through SolrJ, using this code: SolrQuery queryString = new SolrQuery(); for (String param : query.keySet()) { if (param.equals("fq")) { queryString.addFilterQuery(query.get(param)); } else { queryString.setParam(param, query.get(param)); } } System.out.println(queryString.toString()); QueryResponse response = server.query(queryString); //Exception takes place at this line SolrDocumentList docList = response.getResults(); Which constructs a URL like so: q=attr_content%3Alynx&sort=attr_location+desc&group=true&group.field=attr_directory This throws an exception: Caused by: org.apache.solr.common.SolrException: parsing error at org.apache.solr.client.solrj.impl.XMLResponseParser.processResponse(XMLResponseParser.java:145) at org.apache.solr.client.solrj.impl.XMLResponseParser.processResponse(XMLResponseParser.java:106) at org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:477) at org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:244) at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:89) ... 3 more Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[3,30088] Message: error reading value:LST at org.apache.solr.client.solrj.impl.XMLResponseParser.readArray(XMLResponseParser.java:324) at org.apache.solr.client.solrj.impl.XMLResponseParser.readNamedList(XMLResponseParser.java:245) at org.apache.solr.client.solrj.impl.XMLResponseParser.readNamedList(XMLResponseParser.java:244) at org.apache.solr.client.solrj.impl.XMLResponseParser.readNamedList(XMLResponseParser.java:244) at org.apache.solr.client.solrj.impl.XMLResponseParser.processResponse(XMLResponseParser.java:130) I have tried it with both Jetty and Tomcat, the error is the same for both. I have managed to get other queries to run (with both servers), so I presume that the problem lies with this particular type of query. Any insight on this problem will be highly appreciated, Thanks :)
Return stemmed word
Hi, We have stemming in our Solr search and we need to retrieve the word/phrase after stemming. That is if I search for "oranges", through stemming a search for "orange" is carried out. If I turn on debugQuery I would be able to see this, however we'd like to access it through the result if possible. Basically, we need this, because we pass the searched word as a parameter to a 3rd party application which highlights the word in an online PDF reader. Currently, if a user searches for "oranges" and a document contains "orange", then the PDF wouldn't highlight anything since it tries to highlight "oranges" not "orange". Thanks all in advance, Kurt
Re: Query problem in Solr
@ Pravesh: It's 2 seperate cores, not 2 indexes. Sorry for that. @ Erick: Yes, I've seen this suggestion and it seems to be the only possible solution. I'll look into it. Thanks for your answers guys! Kurt On Wed, Jun 1, 2011 at 4:24 PM, Erick Erickson wrote: > If I read this correctly, one approach is to specify an > increment gap in a multiValued field, then search for phrases > with a slop less than that increment gap. i.e. > incrementGap=100 in your definition, and search for > "apple orange"~99 > > If this is gibberish, please post some examples and we'll > try something else. > > Best > Erick > > On Wed, Jun 1, 2011 at 4:21 AM, Kurt Sultana > wrote: > > Hi all, > > > > We're using Solr to search on a Shop index and a Product index. Currently > a > > Shop has a field `shop_keyword` which also contains the keywords of the > > products assigned to it. The shop keywords are separated by a space. > > Consequently, if there is a product which has a keyword "apple" and > another > > which has "orange", a search for shops having `Apple AND Orange` would > > return the shop for these products. > > > > However, this is incorrect since we want that a search for shops having > > `Apple AND Orange` returns shop(s) having products with both "apple" and > > "orange" as keywords. > > > > We tried solving this problem, by making shop keywords multi-valued and > > assigning the keywords of every product of the shop as a new value in > shop > > keywords. However as was confirmed in another post > > > http://markmail.org/thread/xce4qyzs5367yplo#query:+page:1+mid:76eerw5yqev2aanu+state:results > , > > Solr does not support "all words must match in the same value of a > > multi-valued field". > > > > (Hope I explained myself well) > > > > How can we go about this? Ideally, we shouldn't change our search > > infrastructure dramatically. > > > > Thanks! > > > > Krt_Malta > > >
Query problem in Solr
Hi all, We're using Solr to search on a Shop index and a Product index. Currently a Shop has a field `shop_keyword` which also contains the keywords of the products assigned to it. The shop keywords are separated by a space. Consequently, if there is a product which has a keyword "apple" and another which has "orange", a search for shops having `Apple AND Orange` would return the shop for these products. However, this is incorrect since we want that a search for shops having `Apple AND Orange` returns shop(s) having products with both "apple" and "orange" as keywords. We tried solving this problem, by making shop keywords multi-valued and assigning the keywords of every product of the shop as a new value in shop keywords. However as was confirmed in another post http://markmail.org/thread/xce4qyzs5367yplo#query:+page:1+mid:76eerw5yqev2aanu+state:results, Solr does not support "all words must match in the same value of a multi-valued field". (Hope I explained myself well) How can we go about this? Ideally, we shouldn't change our search infrastructure dramatically. Thanks! Krt_Malta
Re: Returning documents using multi-valued field
Thanks for you answer James :) For guys who would meet up with this problem, http://markmail.org/thread/xce4qyzs5367yplo also speaks about this, and reaches James' conclusion too. On Thu, May 26, 2011 at 10:19 PM, Dyer, James wrote: > This is a limitation of Lucene/Solr in that there is no way to tell it to > not match across mutli-valued field occurences. > > A workaround is to convert your query to a phrase and add a "slop" factor > less than your posititonIncrementGap. ex: q="alice trudy"~99 ... This > example assumes that your positionIncrementGap is set to 100 (the default I > think) or greater. This tells it that rather than search for a strict > phrase, the words in the phrase can be up to 99 positions apart. Because > the multi-valued fields are implemented under-the-covers by simply > increasing the position of the next occurrence by the positionIncrementGap > value, this will effectively prevent Lucene/Solr from matching across > occurences. > > The downside to this workaround is that wildcards are not permitted in > phrase searches. So if you need wildcard support also, then you're out of > luck. > > James Dyer > E-Commerce Systems > Ingram Content Group > (615) 213-4311 > > > -Original Message- > From: Kurt Sultana [mailto:kurtanat...@gmail.com] > Sent: Thursday, May 26, 2011 3:05 PM > To: solr-user@lucene.apache.org > Subject: Re: Returning documents using multi-valued field > > Hi, maybe I wasn't so clear in my previous post. Here's another go (I'd > like > a reply :) ): > > Currently I'm issuing this query on Solr: > > http://localhost:9001/solrfacetsearch/master_Shop/select/?q=%28keyword_text_mv%3A%28alice+AND+trudy%29%29+AND+%28catalogId%3A%22Default%22%29+AND+%28catalogVersion%3AOnline%29&start=0&rows=<http://localhost:9001/solrfacetsearch/master_Shop/select/?q=%28keyword_text_mv%3A%28alice+AND+trudy%29%29+AND+%28catalogId%3A%22Default%22%29+AND+%28catalogVersion%3AOnline%29&start=0&rows=2147483647&facet=true&facet.field=category_string_mv&sort=preferred_boolean+desc%2Cgeo_distance+asc&facet.mincount=1&facet.limit=50&facet.sort=index&radius=111.84681460272012&long=5.2864094&qt=geo&lat=52.2119418&debugQuery=on> > 2147483647 > &facet=true&facet.field=category_string_mv&sort=preferred_boolean+desc%2Cgeo_distance+asc&facet.mincount=1&facet.limit=50&facet.sort=index&radius=111.84681460272012&long=5.2864094&qt=geo&lat=52.2119418&debugQuery=on > > where as you can see I'm searching for keywords Alice AND Trudy. This query > returns a document which contains: > > > alice jill > trudy alex > > > The problem is I'd like the document to be returned only if it contains a > string "alice trudy" in one of its values, in other words, if it contains : > > > alice trudy > jill alex > > > How could I achieve this? I'm supporting the code written by someone else > and I'm quite new to Solr. > > Thanks in advance :) > > Kurt > > > On Wed, May 25, 2011 at 11:44 AM, Kurt Sultana >wrote: > > > > > Hi all, > > > > I'm quite new to Solr and I'm supporting an existing Solr search engine > > which was written by someone else. I've been reading on Solr for the last > > couple of weeks so I'd consider myself beyond the basics. > > > > A particular field, let's say name, is multi-valued. For example, a > > document has a field "name" with values "Alice, Trudy". We want that the > > document is returned when "Alice" or "Trudy" is input and not when "Alice > > Trudy" is entered. Currently the document is even with "Alice Trudy". How > > could this be done? > > > > Thanks a lot! > > Kurt > > > > >
Re: Returning documents using multi-valued field
Hi, maybe I wasn't so clear in my previous post. Here's another go (I'd like a reply :) ): Currently I'm issuing this query on Solr: http://localhost:9001/solrfacetsearch/master_Shop/select/?q=%28keyword_text_mv%3A%28alice+AND+trudy%29%29+AND+%28catalogId%3A%22Default%22%29+AND+%28catalogVersion%3AOnline%29&start=0&rows=2147483647&facet=true&facet.field=category_string_mv&sort=preferred_boolean+desc%2Cgeo_distance+asc&facet.mincount=1&facet.limit=50&facet.sort=index&radius=111.84681460272012&long=5.2864094&qt=geo&lat=52.2119418&debugQuery=on where as you can see I'm searching for keywords Alice AND Trudy. This query returns a document which contains: alice jill trudy alex The problem is I'd like the document to be returned only if it contains a string "alice trudy" in one of its values, in other words, if it contains : alice trudy jill alex How could I achieve this? I'm supporting the code written by someone else and I'm quite new to Solr. Thanks in advance :) Kurt On Wed, May 25, 2011 at 11:44 AM, Kurt Sultana wrote: > > Hi all, > > I'm quite new to Solr and I'm supporting an existing Solr search engine > which was written by someone else. I've been reading on Solr for the last > couple of weeks so I'd consider myself beyond the basics. > > A particular field, let's say name, is multi-valued. For example, a > document has a field "name" with values "Alice, Trudy". We want that the > document is returned when "Alice" or "Trudy" is input and not when "Alice > Trudy" is entered. Currently the document is even with "Alice Trudy". How > could this be done? > > Thanks a lot! > Kurt > >
Returning documents using multi-valued field
Hi all, I'm quite new to Solr and I'm supporting an existing Solr search engine which was written by someone else. I've been reading on Solr for the last couple of weeks so I'd consider myself beyond the basics. A particular field, let's say name, is multi-valued. For example, a document has a field "name" with values "Alice, Trudy". We want that the document is returned when "Alice" or "Trudy" is input and not when "Alice Trudy" is entered. Currently the document is even with "Alice Trudy". How could this be done? Thanks a lot! Kurt