Can I search Solr documents by member of a multi-value field?
I have a set of Solr documents containing (among other fields) multi-value fields with percentage data or -1 if the value is null, e.g.
<doc>
...
<arr name="alpha">
<float>0.23</float>
<float>0.23</float>
<float>0.43</float>
</arr>
<arr name="beta">
<float>0.52</float>
<float>-1.0</float>
<float>0.34</float>
</arr>
<arr name="gamma">
<float>-1.0</float>
<float>-1.0</float>
<float>-1.0</开发者_如何学运维float>
</arr>
...
</doc>
I need to find documents where a multi-value field contains or doesn't contain a certain member for a complete set of test cases. If I can get either of the queries below to work, it would be a tremendous help to locate a particular document out of several hundred thousand:
1) Can I find a document where none of the members of a specific multi-value field meet a certain criterion? (The above doc would be returned if I queried for "alpha has no members matching -1".)
2) Can I find a document where at least one of the members of a specific multi-value field meets a certain criterion? (The above doc would be returned if I queried for "alpha has least one member > 0" or "beta has at least one member > 0".)
I'm assuming that a query like alpha:[0 TO 1]
doesn't work because the field is an array instead of a scalar. A definitive answer of "This is impossible" is just as useful as an answer of "Here's how you do it" -- thanks in advance.
EDIT: As with so many problems, the answer is "recheck your assumptions" -- specifically, the developer who generated our documents turned off indexing on the percentage fields.
Yes.
-alpha:"-1.0"
achieves this.Your own example,
alpha:[0 TO 1]
, is the solution.
To put simply why this works: Each field is not a value or an array, but rather a vector of terms. Querying a field for a certain term is a request for inclusion (or exclusion), not an equality operation.
The array you are referring to is a part of the result set, which is plain stored data that is returned by Solr as part of the search results.
It is certainly possible.
I usually use the FQ (filter query) parameter to get what you want: http://wiki.apache.org/solr/CommonQueryParameters#fq
But you can just throw it on the query as well.
Solution for #1:
fq=-alpha:-1.0
Filters out anything that has alpha equal to -1.0
I am not sure about solution #2. Have you tried the code you mentioned?
fq=beta:[0.0 TO 1.0]
I don't have a good sample dataset to test on.
精彩评论