Question

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.

Was it helpful?

Solution

  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.

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top