web-dev-qa-db-fra.com

Comment spécifier deux champs dans Lucene QueryParser?

J'ai lu Comment incorporer plusieurs champs dans QueryParser? mais je ne l'ai pas compris.

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

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) 

ainsi l'analyseur recherche le mot recherché dans le champ "bodytext" et dans le champ "title".

62
Tyzak

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

La première consiste à construire une requête manuellement, c'est ce que QueryParser fait en interne. C'est le moyen le plus puissant de le faire, et cela signifie que vous n'avez pas à analyser l'entrée utilisateur si vous souhaitez empêcher l'accès à certaines des fonctionnalités les plus exotiques de 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 consiste à utiliser MultiFieldQueryParser, cela se comporte comme QueryParser, permettant l'accès à toute la puissance dont il dispose, sauf qu'il recherche 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 façon est d'utiliser la syntaxe spéciale de QueryParservoir 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));

Votre autre option consiste à créer un nouveau champ lorsque vous indexez votre contenu appelé bodytextandtitle, dans lequel vous pouvez placer le contenu de à la fois bodytext et title, alors vous seul avoir à rechercher un champ.

148
Sam Doshi