You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-user@lucene.apache.org by Sandeep Mestry <sa...@gmail.com> on 2013/04/29 18:44:19 UTC

Exact and Partial Matches

Dear Experts,

I have a requirement for the exact matches and applying alphabetical
sorting thereafter.

To illustrate, the results should be sorted in exact matches and all later
alphabetical.

So, if there are 5 documents as below

Doc1
title: trees

Doc 2
title: plum trees

Doc 3
title: Money Trees (Legendary Trees)

Doc 4
title: Cork Trees

Doc 5
title: Old Trees

Then, if user searches with query term as 'trees', the results should be in
following order:

Doc 1 trees - Highest Rank
Doc 4 Cork Trees - Alphabetical afterwards..
Doc 3 Money Trees (Legendary Trees)
Doc 5 Old Trees
Doc 2 plum trees

I can achieve the alphabetical sorting by adding the title sort
parameter, However,
Solr relevancy is higher for Doc 3 (due to matches in 2 terms and so
it arranges
Doc 3 above Doc 4, 5 and 2).
So, it looks like:

Doc 1 trees - Highest Rank
Doc 3 Money Trees (Legendary Trees)
Doc 4 Cork Trees - Alphabetical afterwards..
Doc 5 Old Trees
Doc 2 plum trees

Can you tell me an easy way to achieve this requirement please?

I'm using Solr 4.0 and the *title *field is defined as follows:

<fieldType name="text_wc" class="solr.TextField" positionIncrementGap="100"
>
            <analyzer type="index">
                <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                <filter class="solr.WordDelimiterFilterFactory"
stemEnglishPossessive="0" generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1"
splitOnNumerics="0" preserveOriginal="1" />
                <filter class="solr.LowerCaseFilterFactory"/>
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                <filter class="solr.WordDelimiterFilterFactory"
stemEnglishPossessive="0" generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1"
splitOnNumerics="0" preserveOriginal="1" />
                <filter class="solr.LowerCaseFilterFactory"/>
            </analyzer>
        </fieldType>



Many Thanks in advance,
Sandeep

Re: Exact and Partial Matches

Posted by Otis Gospodnetic <ot...@gmail.com>.
An alternative would be a custom SearchComponent that post-processes hits.

Otis
Solr & ElasticSearch Support
http://sematext.com/
On Apr 30, 2013 10:27 AM, "Sandeep Mestry" <sa...@gmail.com> wrote:

> Thanks Erick,
>
> I tried grouping and it appears to work okay. However, I will need to
> change the client to parse the output..
>
> &fq=title:(tree)&group=true&group.query=title:(trees) NOT
> title_ci:trees&group.query=title_ci:blair&group.sort=title_sort
> desc&sort=score desc,title_sort asc
>
> I used the actual query as the filter query so my scores will be 1 and then
> used 2 group queries - one which will give me exact matches and other that
> will give me partial minus exact matches.
> I have tried this with operators too and it seems to be doing the job I
> want, do you see any issue in this?
>
> Thanks again for your reply and by the way thanks for SOLR-4662.
>
> -S
>
>
> On 30 April 2013 15:06, Erick Erickson <er...@gmail.com> wrote:
>
> > I don't think you can do that. You're essentially
> > trying to mix ordering of the result set. You
> > _might_ be able to kludge some of this with
> > grouping, but I doubt it.
> >
> > You'll need two queries I'd guess.
> >
> > Best
> > Erick
> >
> > On Mon, Apr 29, 2013 at 9:44 AM, Sandeep Mestry <sa...@gmail.com>
> > wrote:
> > > Dear Experts,
> > >
> > > I have a requirement for the exact matches and applying alphabetical
> > > sorting thereafter.
> > >
> > > To illustrate, the results should be sorted in exact matches and all
> > later
> > > alphabetical.
> > >
> > > So, if there are 5 documents as below
> > >
> > > Doc1
> > > title: trees
> > >
> > > Doc 2
> > > title: plum trees
> > >
> > > Doc 3
> > > title: Money Trees (Legendary Trees)
> > >
> > > Doc 4
> > > title: Cork Trees
> > >
> > > Doc 5
> > > title: Old Trees
> > >
> > > Then, if user searches with query term as 'trees', the results should
> be
> > in
> > > following order:
> > >
> > > Doc 1 trees - Highest Rank
> > > Doc 4 Cork Trees - Alphabetical afterwards..
> > > Doc 3 Money Trees (Legendary Trees)
> > > Doc 5 Old Trees
> > > Doc 2 plum trees
> > >
> > > I can achieve the alphabetical sorting by adding the title sort
> > > parameter, However,
> > > Solr relevancy is higher for Doc 3 (due to matches in 2 terms and so
> > > it arranges
> > > Doc 3 above Doc 4, 5 and 2).
> > > So, it looks like:
> > >
> > > Doc 1 trees - Highest Rank
> > > Doc 3 Money Trees (Legendary Trees)
> > > Doc 4 Cork Trees - Alphabetical afterwards..
> > > Doc 5 Old Trees
> > > Doc 2 plum trees
> > >
> > > Can you tell me an easy way to achieve this requirement please?
> > >
> > > I'm using Solr 4.0 and the *title *field is defined as follows:
> > >
> > > <fieldType name="text_wc" class="solr.TextField"
> > positionIncrementGap="100"
> > >>
> > >             <analyzer type="index">
> > >                 <tokenizer class="solr.WhitespaceTokenizerFactory"/>
> > >                 <filter class="solr.WordDelimiterFilterFactory"
> > > stemEnglishPossessive="0" generateWordParts="1" generateNumberParts="1"
> > > catenateWords="1" catenateNumbers="1" catenateAll="1"
> > splitOnCaseChange="1"
> > > splitOnNumerics="0" preserveOriginal="1" />
> > >                 <filter class="solr.LowerCaseFilterFactory"/>
> > >             </analyzer>
> > >             <analyzer type="query">
> > >                 <tokenizer class="solr.WhitespaceTokenizerFactory"/>
> > >                 <filter class="solr.WordDelimiterFilterFactory"
> > > stemEnglishPossessive="0" generateWordParts="1" generateNumberParts="1"
> > > catenateWords="1" catenateNumbers="1" catenateAll="1"
> > splitOnCaseChange="1"
> > > splitOnNumerics="0" preserveOriginal="1" />
> > >                 <filter class="solr.LowerCaseFilterFactory"/>
> > >             </analyzer>
> > >         </fieldType>
> > >
> > >
> > >
> > > Many Thanks in advance,
> > > Sandeep
> >
>

Re: Exact and Partial Matches

Posted by Sandeep Mestry <sa...@gmail.com>.
Thanks Erick,

I tried grouping and it appears to work okay. However, I will need to
change the client to parse the output..

&fq=title:(tree)&group=true&group.query=title:(trees) NOT
title_ci:trees&group.query=title_ci:blair&group.sort=title_sort
desc&sort=score desc,title_sort asc

I used the actual query as the filter query so my scores will be 1 and then
used 2 group queries - one which will give me exact matches and other that
will give me partial minus exact matches.
I have tried this with operators too and it seems to be doing the job I
want, do you see any issue in this?

Thanks again for your reply and by the way thanks for SOLR-4662.

-S


On 30 April 2013 15:06, Erick Erickson <er...@gmail.com> wrote:

> I don't think you can do that. You're essentially
> trying to mix ordering of the result set. You
> _might_ be able to kludge some of this with
> grouping, but I doubt it.
>
> You'll need two queries I'd guess.
>
> Best
> Erick
>
> On Mon, Apr 29, 2013 at 9:44 AM, Sandeep Mestry <sa...@gmail.com>
> wrote:
> > Dear Experts,
> >
> > I have a requirement for the exact matches and applying alphabetical
> > sorting thereafter.
> >
> > To illustrate, the results should be sorted in exact matches and all
> later
> > alphabetical.
> >
> > So, if there are 5 documents as below
> >
> > Doc1
> > title: trees
> >
> > Doc 2
> > title: plum trees
> >
> > Doc 3
> > title: Money Trees (Legendary Trees)
> >
> > Doc 4
> > title: Cork Trees
> >
> > Doc 5
> > title: Old Trees
> >
> > Then, if user searches with query term as 'trees', the results should be
> in
> > following order:
> >
> > Doc 1 trees - Highest Rank
> > Doc 4 Cork Trees - Alphabetical afterwards..
> > Doc 3 Money Trees (Legendary Trees)
> > Doc 5 Old Trees
> > Doc 2 plum trees
> >
> > I can achieve the alphabetical sorting by adding the title sort
> > parameter, However,
> > Solr relevancy is higher for Doc 3 (due to matches in 2 terms and so
> > it arranges
> > Doc 3 above Doc 4, 5 and 2).
> > So, it looks like:
> >
> > Doc 1 trees - Highest Rank
> > Doc 3 Money Trees (Legendary Trees)
> > Doc 4 Cork Trees - Alphabetical afterwards..
> > Doc 5 Old Trees
> > Doc 2 plum trees
> >
> > Can you tell me an easy way to achieve this requirement please?
> >
> > I'm using Solr 4.0 and the *title *field is defined as follows:
> >
> > <fieldType name="text_wc" class="solr.TextField"
> positionIncrementGap="100"
> >>
> >             <analyzer type="index">
> >                 <tokenizer class="solr.WhitespaceTokenizerFactory"/>
> >                 <filter class="solr.WordDelimiterFilterFactory"
> > stemEnglishPossessive="0" generateWordParts="1" generateNumberParts="1"
> > catenateWords="1" catenateNumbers="1" catenateAll="1"
> splitOnCaseChange="1"
> > splitOnNumerics="0" preserveOriginal="1" />
> >                 <filter class="solr.LowerCaseFilterFactory"/>
> >             </analyzer>
> >             <analyzer type="query">
> >                 <tokenizer class="solr.WhitespaceTokenizerFactory"/>
> >                 <filter class="solr.WordDelimiterFilterFactory"
> > stemEnglishPossessive="0" generateWordParts="1" generateNumberParts="1"
> > catenateWords="1" catenateNumbers="1" catenateAll="1"
> splitOnCaseChange="1"
> > splitOnNumerics="0" preserveOriginal="1" />
> >                 <filter class="solr.LowerCaseFilterFactory"/>
> >             </analyzer>
> >         </fieldType>
> >
> >
> >
> > Many Thanks in advance,
> > Sandeep
>

Re: Exact and Partial Matches

Posted by Erick Erickson <er...@gmail.com>.
I don't think you can do that. You're essentially
trying to mix ordering of the result set. You
_might_ be able to kludge some of this with
grouping, but I doubt it.

You'll need two queries I'd guess.

Best
Erick

On Mon, Apr 29, 2013 at 9:44 AM, Sandeep Mestry <sa...@gmail.com> wrote:
> Dear Experts,
>
> I have a requirement for the exact matches and applying alphabetical
> sorting thereafter.
>
> To illustrate, the results should be sorted in exact matches and all later
> alphabetical.
>
> So, if there are 5 documents as below
>
> Doc1
> title: trees
>
> Doc 2
> title: plum trees
>
> Doc 3
> title: Money Trees (Legendary Trees)
>
> Doc 4
> title: Cork Trees
>
> Doc 5
> title: Old Trees
>
> Then, if user searches with query term as 'trees', the results should be in
> following order:
>
> Doc 1 trees - Highest Rank
> Doc 4 Cork Trees - Alphabetical afterwards..
> Doc 3 Money Trees (Legendary Trees)
> Doc 5 Old Trees
> Doc 2 plum trees
>
> I can achieve the alphabetical sorting by adding the title sort
> parameter, However,
> Solr relevancy is higher for Doc 3 (due to matches in 2 terms and so
> it arranges
> Doc 3 above Doc 4, 5 and 2).
> So, it looks like:
>
> Doc 1 trees - Highest Rank
> Doc 3 Money Trees (Legendary Trees)
> Doc 4 Cork Trees - Alphabetical afterwards..
> Doc 5 Old Trees
> Doc 2 plum trees
>
> Can you tell me an easy way to achieve this requirement please?
>
> I'm using Solr 4.0 and the *title *field is defined as follows:
>
> <fieldType name="text_wc" class="solr.TextField" positionIncrementGap="100"
>>
>             <analyzer type="index">
>                 <tokenizer class="solr.WhitespaceTokenizerFactory"/>
>                 <filter class="solr.WordDelimiterFilterFactory"
> stemEnglishPossessive="0" generateWordParts="1" generateNumberParts="1"
> catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1"
> splitOnNumerics="0" preserveOriginal="1" />
>                 <filter class="solr.LowerCaseFilterFactory"/>
>             </analyzer>
>             <analyzer type="query">
>                 <tokenizer class="solr.WhitespaceTokenizerFactory"/>
>                 <filter class="solr.WordDelimiterFilterFactory"
> stemEnglishPossessive="0" generateWordParts="1" generateNumberParts="1"
> catenateWords="1" catenateNumbers="1" catenateAll="1" splitOnCaseChange="1"
> splitOnNumerics="0" preserveOriginal="1" />
>                 <filter class="solr.LowerCaseFilterFactory"/>
>             </analyzer>
>         </fieldType>
>
>
>
> Many Thanks in advance,
> Sandeep