From ea3479d24318e1ac6b4555a4d0cde173fd937244 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 11 Jan 2011 14:06:15 -0800 Subject: [PATCH] Modifying default parsing behavior in Lucene --HG-- branch : 1.x --- .../Indexing/LuceneSearchBuilderTests.cs | 24 ++++++++++++------- .../Lucene/Services/LuceneSearchBuilder.cs | 12 ++++++---- src/Orchard/Indexing/ISearchBuilder.cs | 4 ++-- src/Orchard/Indexing/NullSearchBuilder.cs | 4 ++-- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs b/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs index a3995e4e4..eba184fdf 100644 --- a/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs +++ b/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs @@ -231,14 +231,14 @@ namespace Orchard.Tests.Modules.Indexing { _provider.Store("default", _provider.New(2).Add("body", "Renaud is also in the kitchen.").Analyze().Add("title", "A love affair").Analyze()); _provider.Store("default", _provider.New(3).Add("body", "Bertrand is a little bit jealous.").Analyze().Add("title", "Soap opera").Analyze()); - Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen").Count(), Is.EqualTo(2)); - Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen bertrand").Count(), Is.EqualTo(3)); - Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen +bertrand").Count(), Is.EqualTo(1)); - Assert.That(_searchBuilder.Parse(new[] { "body" }, "+kitchen +bertrand").Count(), Is.EqualTo(0)); - Assert.That(_searchBuilder.Parse(new[] { "body" }, "kit").Count(), Is.EqualTo(0)); - Assert.That(_searchBuilder.Parse(new[] { "body" }, "kit*").Count(), Is.EqualTo(2)); - Assert.That(_searchBuilder.Parse(new[] { "body", "title" }, "bradley love^3 soap").Count(), Is.EqualTo(3)); - Assert.That(_searchBuilder.Parse(new[] { "body", "title" }, "bradley love^3 soap").Search().First().ContentItemId, Is.EqualTo(2)); + Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen", false).Count(), Is.EqualTo(2)); + Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen bertrand", false).Count(), Is.EqualTo(3)); + Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen +bertrand", false).Count(), Is.EqualTo(1)); + Assert.That(_searchBuilder.Parse(new[] { "body" }, "+kitchen +bertrand", false).Count(), Is.EqualTo(0)); + Assert.That(_searchBuilder.Parse(new[] { "body" }, "kit", false).Count(), Is.EqualTo(0)); + Assert.That(_searchBuilder.Parse(new[] { "body" }, "kit*", false).Count(), Is.EqualTo(2)); + Assert.That(_searchBuilder.Parse(new[] { "body", "title" }, "bradley love^3 soap", false).Count(), Is.EqualTo(3)); + Assert.That(_searchBuilder.Parse(new[] { "body", "title" }, "bradley love^3 soap", false).Search().First().ContentItemId, Is.EqualTo(2)); } [Test] @@ -308,6 +308,14 @@ namespace Orchard.Tests.Modules.Indexing { Assert.That(_searchBuilder.Parse("title", "home").WithField("culture", 1033).AsFilter().Count(), Is.EqualTo(1)); } + [Test] + public void ParsedTextShouldBeEscapedByDefault() { + _provider.CreateIndex("default"); + _provider.Store("default", _provider.New(1).Add("body", "foo.bar").Analyze()); + + Assert.That(_searchBuilder.Parse("body", "*@!woo*@!").Count(), Is.EqualTo(0)); + } + [Test] public void FieldsCanContainMultipleValue() { _provider.CreateIndex("default"); diff --git a/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs b/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs index b3ac6738a..4b7bce28b 100644 --- a/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs +++ b/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs @@ -48,11 +48,11 @@ namespace Lucene.Services { InitPendingClause(); } - public ISearchBuilder Parse(string defaultField, string query) { - return Parse(new[] {defaultField}, query); + public ISearchBuilder Parse(string defaultField, string query, bool escape, bool mandatory) { + return Parse(new[] {defaultField}, query, escape, mandatory); } - public ISearchBuilder Parse(string[] defaultFields, string query) { + public ISearchBuilder Parse(string[] defaultFields, string query, bool escape, bool mandatory) { if ( defaultFields.Length == 0 ) { throw new ArgumentException("Default field can't be empty"); } @@ -61,9 +61,13 @@ namespace Lucene.Services { throw new ArgumentException("Query can't be empty"); } + if (escape) { + query = QueryParser.Escape(query); + } + var analyzer = LuceneIndexProvider.CreateAnalyzer(); foreach ( var defaultField in defaultFields ) { - var clause = new BooleanClause(new QueryParser(LuceneIndexProvider.LuceneVersion, defaultField, analyzer).Parse(query), BooleanClause.Occur.SHOULD); + var clause = new BooleanClause(new QueryParser(LuceneIndexProvider.LuceneVersion, defaultField, analyzer).Parse(query), mandatory ? BooleanClause.Occur.MUST : BooleanClause.Occur.SHOULD); _clauses.Add(clause); } diff --git a/src/Orchard/Indexing/ISearchBuilder.cs b/src/Orchard/Indexing/ISearchBuilder.cs index bd6daa0f7..355615401 100644 --- a/src/Orchard/Indexing/ISearchBuilder.cs +++ b/src/Orchard/Indexing/ISearchBuilder.cs @@ -3,8 +3,8 @@ using System.Collections.Generic; namespace Orchard.Indexing { public interface ISearchBuilder { - ISearchBuilder Parse(string defaultField, string query); - ISearchBuilder Parse(string[] defaultFields, string query); + ISearchBuilder Parse(string defaultField, string query, bool escape = true, bool mandatory = false); + ISearchBuilder Parse(string[] defaultFields, string query, bool escape = true, bool mandatory = false); ISearchBuilder WithField(string field, bool value); ISearchBuilder WithField(string field, DateTime value); diff --git a/src/Orchard/Indexing/NullSearchBuilder.cs b/src/Orchard/Indexing/NullSearchBuilder.cs index e913554c2..0e64dd9bb 100644 --- a/src/Orchard/Indexing/NullSearchBuilder.cs +++ b/src/Orchard/Indexing/NullSearchBuilder.cs @@ -4,11 +4,11 @@ using System.Linq; namespace Orchard.Indexing { public class NullSearchBuilder : ISearchBuilder { - public ISearchBuilder Parse(string defaultField, string query) { + public ISearchBuilder Parse(string defaultField, string query, bool escape, bool mandatory) { return this; } - public ISearchBuilder Parse(string[] defaultFields, string query) { + public ISearchBuilder Parse(string[] defaultFields, string query, bool escape, bool mandatory) { return this; }