Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 244
Cyranix Avatar asked Aug 31 '10 16:08

Cyranix


2 Answers

  1. Yes. -alpha:"-1.0" achieves this.

  2. 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.

like image 107
Karl Johansson Avatar answered Oct 13 '22 20:10

Karl Johansson


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.

like image 42
Aaron D Avatar answered Oct 13 '22 21:10

Aaron D