Comment spécifier deux champs dans Lucene QueryParser?

J’ai lu Comment incorporer plusieurs champs dans QueryParser? mais je n’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’parsingur recherche le mot recherché dans le champ “corps-texte” et dans le champ “titre”.

Il y a 3 façons de le faire.

La première consiste à construire une requête manuellement, c’est ce que fait QueryParser en interne. C’est le moyen le plus puissant de le faire et cela signifie que vous n’avez pas à parsingr les entrées de l’utilisateur si vous souhaitez empêcher l’access à certaines des fonctionnalités les plus exotiques de QueryParser :

 IndexReader reader = IndexReader.Open(""); Searcher searcher = new IndexSearcher(reader); BooleanQuery booleanQuery = new BooleanQuery(); Query query1 = new TermQuery(new Term("bodytext", "")); Query query2 = new TermQuery(new Term("title", "")); 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 méthode consiste à utiliser MultiFieldQueryParser , qui se comporte comme QueryParser , permettant d’accéder à toute la puissance dont il dispose, sauf qu’il effectuera des recherches sur plusieurs champs.

 IndexReader reader = IndexReader.Open(""); Searcher searcher = new IndexSearcher(reader); Analyzer analyzer = new StandardAnalyzer(); MultiFieldQueryParser queryParser = new MultiFieldQueryParser( new ssortingng[] {"bodytext", "title"}, analyzer); Hits hits = searcher.Search(queryParser.parse("")); 

La dernière méthode consiste à utiliser la syntaxe spéciale de QueryParser voir ici .

 IndexReader reader = IndexReader.Open(""); Searcher searcher = new IndexSearcher(reader); Analyzer analyzer = new StandardAnalyzer(); QueryParser queryParser = new QueryParser("", analyzer); //  is the field that QueryParser will search if you don't // prefix it with a field. ssortingng 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 à la fois du corps et du titre, il vous suffit alors de rechercher un champ.