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(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");

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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;
}