73 votes

Comment spécifier deux champs dans Lucene QueryParser ?

Je lis Comment incorporer plusieurs champs dans QueryParser ? mais je ne l'ai pas eu.

En ce moment, j'ai une construction très étrange :

parser = New QueryParser("bodytext", analyzer)
parser2 = New QueryParser("title", analyzer)
query = parser.Parse(strSuchbegriff)
query2 = parser.Parse(strSuchbegriff)

Que puis-je faire pour quelque chose comme :

parser = New QuerParser ("bodytext" , "title",analyzer)
query =parser.Parse(strSuchbegriff) 

L'analyseur cherche donc le mot recherché dans le champ "bodytext" et dans le champ "title".

171voto

Sam Doshi Points 2656

Il y a trois façons de procéder.

La première façon est de construire une requête manuellement, c'est ce que nous faisons. QueryParser fait en interne. C'est la façon la plus puissante de procéder, et cela signifie que vous n'avez pas besoin d'analyser l'entrée de l'utilisateur si vous voulez empêcher l'accès à certaines des fonctions les plus exotiques de l'interface utilisateur. QueryParser :

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);

BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("bodytext", "<text>"));
Query query2 = new TermQuery(new Term("title", "<text>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
// Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
// for AND queries
Hits hits = searcher.Search(booleanQuery);

La deuxième façon est d'utiliser MultiFieldQueryParser ce qui se comporte comme QueryParser Il permet d'accéder à toute la puissance de ce dernier, à l'exception du fait qu'il effectue des recherches sur plusieurs champs.

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);

Analyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
                                        new string[] {"bodytext", "title"},
                                        analyzer);

Hits hits = searcher.Search(queryParser.parse("<text>"));

La dernière solution consiste à utiliser la syntaxe spéciale de l'option QueryParser voir ici .

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);    

Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("<default field>", analyzer);
// <default field> is the field that QueryParser will search if you don't 
// prefix it with a field.
string special = "bodytext:" + text + " OR title:" + text;

Hits hits = searcher.Search(queryParser.parse(special));

L'autre option consiste à créer un nouveau champ lors de l'indexation de votre contenu, appelé bodytextandtitle, dans lequel vous pouvez placer le contenu de la rubrique ambos bodytext et title, vous ne devez rechercher qu'un seul champ.

0 votes

Merci pour ce "string special = "bodytext :" + text + " OR title :" + texte" , cela a résolu mon problème :D

0 votes

Nous devons utiliser le constructeur BooleanQuery.Builder finalQuery = new BooleanQuery.Builder() ;

0voto

Nous ne pouvons pas utiliser BooleanQuery booleanQuery = new BooleanQuery() ;

Nous devons utiliser le constructeur BooleanQuery.Builder finalQuery = new BooleanQuery.Builder() ; puis nous pouvons utiliser finalQuery.build() ; pour obtenir la requête

Une manière plus générique de faire cela est

private static TopDocs search(Map filters, IndexSearcher searcher) throws Exception {
    StandardAnalyzer analyzer = new StandardAnalyzer();
    BooleanQuery.Builder finalQuery = new BooleanQuery.Builder();

    for(String attribute : filters.keySet()) {
        QueryParser queryParser = new QueryParser(attribute, analyzer);
        Query query = queryParser.parse(filters.get(attribute));
        finalQuery.add(query, Occur.MUST);
    }

    TopDocs hits = searcher.search(finalQuery.build(),10);
    return hits;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X