Dostępne są 3 sposoby.
Pierwszy sposób polega na ręcznym utworzeniu zapytania, co robi wewnętrznie QueryParser
. To jest najbardziej skutecznym sposobem, aby to zrobić, a to oznacza, że nie masz do analizowania danych wprowadzonych przez użytkownika, jeśli chcesz, aby uniemożliwić dostęp do niektórych bardziej egzotycznych cech 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);
Drugim sposobem jest aby użyć MultiFieldQueryParser
, zachowuje się to jak QueryParser
, umożliwiając dostęp do całej posiadanej mocy, z tym wyjątkiem, że przeszuka wiele pól.
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>"));
Ostatnim sposobem jest użycie specjalnej składni QueryParser
see here.
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));
Twój Inną opcją jest stworzenie nowego pola, gdy wskaźnik treść nazywa bodytextandtitle, w którym można umieścić zawartość zarówno bodytext i tytuł, a potem trzeba tylko poszukać jedno pole.