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.