Matching a single instance of a multivalued field

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Matching a single instance of a multivalued field

Tom Mortimer
Hi!

I have a requirement to be able to restrict search results to a single
instance of a multivalued field. e.g. with the doc:

    text: [ "striped skunk", "spotted hyena" ]

the queries (skunk AND striped), (spotted AND hyena) should return the
document, but (striped AND hyena), (skunk AND spotted) should not.

Can anyone give me any suggestions how to do this? I was thinking that
setting a massive position increment gap between multiple values and then
using a SpanNearQuery with a large (but smaller than the gap) slop might do
the job, but the field values could be quite long (I don't know if there's
a limit). Is there a neater way?

cheers,
Tom
Reply | Threaded
Open this post in threaded view
|

Re: Matching a single instance of a multivalued field

Adrien Grand
Hi Tom,

One way to solve this could be to use block joins by indexing each value in
its own document and joining the parent document using
ToParentBlockJoinQuery.

Le ven. 8 juin 2018 à 16:46, Tom Mortimer <[hidden email]> a écrit :

> Hi!
>
> I have a requirement to be able to restrict search results to a single
> instance of a multivalued field. e.g. with the doc:
>
>     text: [ "striped skunk", "spotted hyena" ]
>
> the queries (skunk AND striped), (spotted AND hyena) should return the
> document, but (striped AND hyena), (skunk AND spotted) should not.
>
> Can anyone give me any suggestions how to do this? I was thinking that
> setting a massive position increment gap between multiple values and then
> using a SpanNearQuery with a large (but smaller than the gap) slop might do
> the job, but the field values could be quite long (I don't know if there's
> a limit). Is there a neater way?
>
> cheers,
> Tom
>
Reply | Threaded
Open this post in threaded view
|

Re: Matching a single instance of a multivalued field

Tom Mortimer
Ah, that's an interesting idea - thanks Adrien!

On Fri, Jun 8, 2018 at 3:54 PM Adrien Grand <[hidden email]> wrote:

> Hi Tom,
>
> One way to solve this could be to use block joins by indexing each value in
> its own document and joining the parent document using
> ToParentBlockJoinQuery.
>
> Le ven. 8 juin 2018 à 16:46, Tom Mortimer <[hidden email]> a écrit :
>
> > Hi!
> >
> > I have a requirement to be able to restrict search results to a single
> > instance of a multivalued field. e.g. with the doc:
> >
> >     text: [ "striped skunk", "spotted hyena" ]
> >
> > the queries (skunk AND striped), (spotted AND hyena) should return the
> > document, but (striped AND hyena), (skunk AND spotted) should not.
> >
> > Can anyone give me any suggestions how to do this? I was thinking that
> > setting a massive position increment gap between multiple values and then
> > using a SpanNearQuery with a large (but smaller than the gap) slop might
> do
> > the job, but the field values could be quite long (I don't know if
> there's
> > a limit). Is there a neater way?
> >
> > cheers,
> > Tom
> >
>