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".
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 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));
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.