FAQ
Hello everybody,

I have a search app in which the user can specify in which category the
documents he's searching are. So all my indexed documents have a
"category" field as well as other fields such as title, description,
etc. So when the user enters his query, only the documents that are in
the given category and which match a part of the query must be returned.

So I tried to use a MultiFieldQueryParser with SHOULD clauses on the
title, description, etc and a MUST clause on the category field. It
works pretty well but the problem is that _all_ the documents in the
searched category are returned, even if they don't have any similarity
with the search string (except for the category of course).

I think that's because of the MUST field which takes precedence on the
SHOULD fields or something like that ? I saw in the BooleanQuery the
method setMinimumNumberShouldMatch(). I think I should use this with my
MultiFieldQueryParser to set a minimum of 1 or 2 fields, but this method
only exists for BooleanQuery instances so I can't use it... I thought
about using directly a BooleanQuery but I want to use the FrenchAnalyzer
for the request.

Any idea on how to achieve this ?

Thanks for your help !

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-user-help@lucene.apache.org

Search Discussions

  • Erick Erickson at Feb 1, 2009 at 5:09 pm
    I think query.toString() is your friend here. I'm having a hard
    time figuring out, from your description, what you actually want,
    so maybe some examples would help too.

    If your users enter terms for each field, then it seems to me that
    you'd want MUST between clauses (in which case MultiFieldQueryParser
    seems unnecesary). That is, if your form is somethinng like
    title: <user enters term>
    description: <user enters another term>
    category: <user enters category>

    If you have them enter just a single term, that is your form looks
    something like
    word:<user enters term to find in title OR description OR etc>
    category: <user enters category>

    and want to form a query like
    (title:term OR description:term OR etc:term) AND category:cat, it's not
    clear from the docs how you would create this in a *single* MFQP. But
    you could easily use MFQP to form the (a OR b OR c) clause, add that
    to a BoleanQuery with MUST, and then create your simple query on
    category and add *that* as a second MUST clause in your BooleanQuery
    and use that for your search.

    HTH
    Erick

    On Sun, Feb 1, 2009 at 5:33 AM, Sylvain wrote:

    Hello everybody,

    I have a search app in which the user can specify in which category the
    documents he's searching are. So all my indexed documents have a
    "category" field as well as other fields such as title, description,
    etc. So when the user enters his query, only the documents that are in
    the given category and which match a part of the query must be returned.

    So I tried to use a MultiFieldQueryParser with SHOULD clauses on the
    title, description, etc and a MUST clause on the category field. It
    works pretty well but the problem is that _all_ the documents in the
    searched category are returned, even if they don't have any similarity
    with the search string (except for the category of course).

    I think that's because of the MUST field which takes precedence on the
    SHOULD fields or something like that ? I saw in the BooleanQuery the
    method setMinimumNumberShouldMatch(). I think I should use this with my
    MultiFieldQueryParser to set a minimum of 1 or 2 fields, but this method
    only exists for BooleanQuery instances so I can't use it... I thought
    about using directly a BooleanQuery but I want to use the FrenchAnalyzer
    for the request.

    Any idea on how to achieve this ?

    Thanks for your help !

    ---------------------------------------------------------------------
    To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
    For additional commands, e-mail: java-user-help@lucene.apache.org
  • Sylvain at Feb 3, 2009 at 7:53 pm
    What I wanted to do was to set at least one "SHOULD" field as required in a
    MFQP. Because of the MUST field I had, even if no SHOULD field matched the
    query, all the documents which had the corresponding MUST field were
    returned. I found a very easy solution to solve my problem ::

    BooleanQuery myQuery = (BooleanQuery)myMFQP.parse(queries, fields,
    booleanClauses, analyzer)
    myQuery.setMinimumNumbersShouldMatch(1)
    mySearcher.search(myQuery)

    And it worked ! Now my results must have at least one "SHOULD" field that
    matches the query.

    Thanks for your explanations !

    2009/2/1 Erick Erickson <erickerickson@gmail.com>
    I think query.toString() is your friend here. I'm having a hard
    time figuring out, from your description, what you actually want,
    so maybe some examples would help too.

    If your users enter terms for each field, then it seems to me that
    you'd want MUST between clauses (in which case MultiFieldQueryParser
    seems unnecesary). That is, if your form is somethinng like
    title: <user enters term>
    description: <user enters another term>
    category: <user enters category>

    If you have them enter just a single term, that is your form looks
    something like
    word:<user enters term to find in title OR description OR etc>
    category: <user enters category>

    and want to form a query like
    (title:term OR description:term OR etc:term) AND category:cat, it's not
    clear from the docs how you would create this in a *single* MFQP. But
    you could easily use MFQP to form the (a OR b OR c) clause, add that
    to a BoleanQuery with MUST, and then create your simple query on
    category and add *that* as a second MUST clause in your BooleanQuery
    and use that for your search.

    HTH
    Erick

    On Sun, Feb 1, 2009 at 5:33 AM, Sylvain wrote:

    Hello everybody,

    I have a search app in which the user can specify in which category the
    documents he's searching are. So all my indexed documents have a
    "category" field as well as other fields such as title, description,
    etc. So when the user enters his query, only the documents that are in
    the given category and which match a part of the query must be returned.

    So I tried to use a MultiFieldQueryParser with SHOULD clauses on the
    title, description, etc and a MUST clause on the category field. It
    works pretty well but the problem is that _all_ the documents in the
    searched category are returned, even if they don't have any similarity
    with the search string (except for the category of course).

    I think that's because of the MUST field which takes precedence on the
    SHOULD fields or something like that ? I saw in the BooleanQuery the
    method setMinimumNumberShouldMatch(). I think I should use this with my
    MultiFieldQueryParser to set a minimum of 1 or 2 fields, but this method
    only exists for BooleanQuery instances so I can't use it... I thought
    about using directly a BooleanQuery but I want to use the FrenchAnalyzer
    for the request.

    Any idea on how to achieve this ?

    Thanks for your help !

    ---------------------------------------------------------------------
    To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
    For additional commands, e-mail: java-user-help@lucene.apache.org

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupjava-user @
categorieslucene
postedFeb 1, '09 at 10:33a
activeFeb 3, '09 at 7:53p
posts3
users2
websitelucene.apache.org

2 users in discussion

Sylvain: 2 posts Erick Erickson: 1 post

People

Translate

site design / logo © 2022 Grokbase