/// <summary> /// Parses a query, searching on the fields specified. Use this if you need to /// specify certain fields as required, and others as prohibited. /// <para/> /// Usage: /// <code> /// string[] fields = {"filename", "contents", "description"}; /// Occur[] flags = {Occur.SHOULD, /// Occur.MUST, /// Occur.MUST_NOT}; /// MultiFieldQueryParser.Parse("query", fields, flags, analyzer); /// </code> /// <para/> /// The code above would construct a query: /// <code> /// (filename:query) +(contents:query) -(description:query) /// </code> /// </summary> /// <param name="query">Query string to parse</param> /// <param name="fields">Fields to search on</param> /// <param name="flags">Flags describing the fields</param> /// <param name="analyzer">Analyzer to use</param> /// <exception cref="ArgumentException"> /// if the length of the fields array differs from the length of the /// flags array /// </exception> public static Query Parse(string query, string[] fields, Occur[] flags, Analyzer analyzer) { if (fields.Length != flags.Length) { throw new ArgumentException("fields.length != flags.length"); } BooleanQuery bQuery = new BooleanQuery(); StandardQueryParser qp = new StandardQueryParser(); qp.Analyzer = analyzer; for (int i = 0; i < fields.Length; i++) { Query q = qp.Parse(query, fields[i]); if (q != null && // q never null, just being defensive (!(q is BooleanQuery) || ((BooleanQuery)q).Clauses.Count > 0)) { bQuery.Add(q, flags[i]); } } return(bQuery); }
/// <summary> /// Parses a query which searches on the fields specified. /// <para/> /// If x fields are specified, this effectively constructs: /// <code> /// (field1:query1) (field2:query2) (field3:query3)...(fieldx:queryx) /// </code> /// </summary> /// <param name="queries">Queries strings to parse</param> /// <param name="fields">Fields to search on</param> /// <param name="analyzer">Analyzer to use</param> /// <exception cref="ArgumentException"> /// if the length of the queries array differs from the length of the /// fields array /// </exception> /// <exception cref="ArgumentNullException"> /// <paramref name="queries"/> or <paramref name="fields"/> is <c>null</c> /// </exception> public static Query Parse(string[] queries, string[] fields, Analyzer analyzer) { // LUCENENET: Added null guard clauses if (queries is null) { throw new ArgumentNullException(nameof(queries)); } if (fields is null) { throw new ArgumentNullException(nameof(fields)); } if (queries.Length != fields.Length) { throw new ArgumentException("queries.Length != fields.Length"); } BooleanQuery bQuery = new BooleanQuery(); StandardQueryParser qp = new StandardQueryParser(); qp.Analyzer = analyzer; for (int i = 0; i < fields.Length; i++) { Query q = qp.Parse(queries[i], fields[i]); if (q != null && // q never null, just being defensive (!(q is BooleanQuery booleanQuery) || booleanQuery.Clauses.Count > 0)) { bQuery.Add(q, Occur.SHOULD); } } return(bQuery); }
/// <summary> /// Parses a query, searching on the fields specified. Use this if you need to /// specify certain fields as required, and others as prohibited. /// <para/> /// Usage: /// <code> /// string[] query = {"query1", "query2", "query3"}; /// string[] fields = {"filename", "contents", "description"}; /// Occur[] flags = {Occur.SHOULD, /// Occur.MUST, /// Occur.MUST_NOT}; /// MultiFieldQueryParser.Parse(query, fields, flags, analyzer); /// </code> /// <para/> /// The code above would construct a query: /// <code> /// (filename:query1) +(contents:query2) -(description:query3) /// </code> /// </summary> /// <param name="queries">Queries string to parse</param> /// <param name="fields">Fields to search on</param> /// <param name="flags">Flags describing the fields</param> /// <param name="analyzer">Analyzer to use</param> /// <exception cref="ArgumentException"> /// if the length of the queries, fields, and flags array differ /// </exception> public static Query Parse(string[] queries, string[] fields, Occur[] flags, Analyzer analyzer) { if (!(queries.Length == fields.Length && queries.Length == flags.Length)) { throw new ArgumentException( "queries, fields, and flags array have have different length"); } BooleanQuery bQuery = new BooleanQuery(); StandardQueryParser qp = new StandardQueryParser(); qp.Analyzer = analyzer; for (int i = 0; i < fields.Length; i++) { Query q = qp.Parse(queries[i], fields[i]); if (q != null && // q never null, just being defensive (!(q is BooleanQuery booleanQuery) || booleanQuery.Clauses.Count > 0)) { bQuery.Add(q, flags[i]); } } return(bQuery); }