Как указать два поля в Lucene QueryParser?
я прочитала Как включить несколько полей в QueryParser? но я не понимаю.
На данный момент у меня очень странная конструкция типа:
parser = New QueryParser("bodytext", analyzer)
parser2 = New QueryParser("title", analyzer)
query = parser.Parse(strSuchbegriff)
query2 = parser.Parse(strSuchbegriff)
что я могу сделать что-то вроде:
parser = New QuerParser ("bodytext" , "title",analyzer)
query =parser.Parse(strSuchbegriff)
поэтому парсер ищет искомое слово в поле "bodytext" и в поле "title".
1 ответ:
есть 3 способа это сделать.
первый способ-построить запрос вручную, это то, что
QueryParser
делает внутренне. Это самый мощный способ сделать это, и означает, что вам не нужно анализировать пользовательский ввод, если вы хотите предотвратить доступ к некоторым из более экзотических функций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);
второй способ-использовать
MultiFieldQueryParser
, так какQueryParser
, позволяя получить доступ ко всей мощности, которую он имеет, за исключением того, что он будет искать по нескольким поля.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>"));
последний способ-использовать специальный синтаксис
QueryParser
посмотреть здесь.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));
другой вариант-создать новое поле при индексировании содержимого под названием bodytextandtitle, в которое можно поместить содержимое и bodytext и title, то вам нужно искать только одно поле.