Modifying default parsing behavior in Lucene

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros
2011-01-11 14:06:15 -08:00
parent 1fe8caec23
commit ea3479d243
4 changed files with 28 additions and 16 deletions

View File

@@ -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(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()); _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", false).Count(), Is.EqualTo(2));
Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen bertrand").Count(), Is.EqualTo(3)); Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen bertrand", false).Count(), Is.EqualTo(3));
Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen +bertrand").Count(), Is.EqualTo(1)); Assert.That(_searchBuilder.Parse(new[] { "body" }, "kitchen +bertrand", false).Count(), Is.EqualTo(1));
Assert.That(_searchBuilder.Parse(new[] { "body" }, "+kitchen +bertrand").Count(), Is.EqualTo(0)); Assert.That(_searchBuilder.Parse(new[] { "body" }, "+kitchen +bertrand", false).Count(), Is.EqualTo(0));
Assert.That(_searchBuilder.Parse(new[] { "body" }, "kit").Count(), Is.EqualTo(0)); Assert.That(_searchBuilder.Parse(new[] { "body" }, "kit", false).Count(), Is.EqualTo(0));
Assert.That(_searchBuilder.Parse(new[] { "body" }, "kit*").Count(), Is.EqualTo(2)); Assert.That(_searchBuilder.Parse(new[] { "body" }, "kit*", false).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", false).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", "title" }, "bradley love^3 soap", false).Search().First().ContentItemId, Is.EqualTo(2));
} }
[Test] [Test]
@@ -308,6 +308,14 @@ namespace Orchard.Tests.Modules.Indexing {
Assert.That(_searchBuilder.Parse("title", "home").WithField("culture", 1033).AsFilter().Count(), Is.EqualTo(1)); 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] [Test]
public void FieldsCanContainMultipleValue() { public void FieldsCanContainMultipleValue() {
_provider.CreateIndex("default"); _provider.CreateIndex("default");

View File

@@ -48,11 +48,11 @@ namespace Lucene.Services {
InitPendingClause(); InitPendingClause();
} }
public ISearchBuilder Parse(string defaultField, string query) { public ISearchBuilder Parse(string defaultField, string query, bool escape, bool mandatory) {
return Parse(new[] {defaultField}, query); 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 ) { if ( defaultFields.Length == 0 ) {
throw new ArgumentException("Default field can't be empty"); throw new ArgumentException("Default field can't be empty");
} }
@@ -61,9 +61,13 @@ namespace Lucene.Services {
throw new ArgumentException("Query can't be empty"); throw new ArgumentException("Query can't be empty");
} }
if (escape) {
query = QueryParser.Escape(query);
}
var analyzer = LuceneIndexProvider.CreateAnalyzer(); var analyzer = LuceneIndexProvider.CreateAnalyzer();
foreach ( var defaultField in defaultFields ) { 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); _clauses.Add(clause);
} }

View File

@@ -3,8 +3,8 @@ using System.Collections.Generic;
namespace Orchard.Indexing { namespace Orchard.Indexing {
public interface ISearchBuilder { public interface ISearchBuilder {
ISearchBuilder Parse(string defaultField, string query); ISearchBuilder Parse(string defaultField, string query, bool escape = true, bool mandatory = false);
ISearchBuilder Parse(string[] defaultFields, string query); ISearchBuilder Parse(string[] defaultFields, string query, bool escape = true, bool mandatory = false);
ISearchBuilder WithField(string field, bool value); ISearchBuilder WithField(string field, bool value);
ISearchBuilder WithField(string field, DateTime value); ISearchBuilder WithField(string field, DateTime value);

View File

@@ -4,11 +4,11 @@ using System.Linq;
namespace Orchard.Indexing { namespace Orchard.Indexing {
public class NullSearchBuilder : ISearchBuilder { public class NullSearchBuilder : ISearchBuilder {
public ISearchBuilder Parse(string defaultField, string query) { public ISearchBuilder Parse(string defaultField, string query, bool escape, bool mandatory) {
return this; return this;
} }
public ISearchBuilder Parse(string[] defaultFields, string query) { public ISearchBuilder Parse(string[] defaultFields, string query, bool escape, bool mandatory) {
return this; return this;
} }