From f2586d06d2800d51ff48e2cd4ed1ed92de31fe6c Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Mon, 28 Mar 2011 22:13:25 -0700 Subject: [PATCH] Fixing ContentItem.ContentType indexing so it can be queried by search --HG-- branch : 1.x --- .../Indexing/LuceneSearchBuilderTests.cs | 36 +++++++++++++++++++ .../Core/Common/Handlers/CommonPartHandler.cs | 4 +-- .../Lucene/Services/LuceneSearchBuilder.cs | 8 +++-- .../Orchard.Tags/Handlers/TagsPartHandler.cs | 8 +++-- src/Orchard.Web/Orchard.Web.csproj | 2 +- 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs b/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs index 00b524343..63f36219a 100644 --- a/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs +++ b/src/Orchard.Tests.Modules/Indexing/LuceneSearchBuilderTests.cs @@ -375,6 +375,42 @@ namespace Orchard.Tests.Modules.Indexing { Assert.That(_searchBuilder.WithField("tag-value", "tag").Count(), Is.EqualTo(1)); } + [Test] + public void AnalyzedFieldsAreNotCaseSensitive() { + _provider.CreateIndex("default"); + var documentIndex = _provider.New(1) + .Add("tag-id", 1) + .Add("tag-value", "Tag1").Analyze(); + + _provider.Store("default", documentIndex); + + // trying in prefix mode + Assert.That(_searchBuilder.WithField("tag-value", "tag").Count(), Is.EqualTo(1)); + Assert.That(_searchBuilder.WithField("tag-value", "Tag").Count(), Is.EqualTo(1)); + + // trying in full word match mode + Assert.That(_searchBuilder.WithField("tag-value", "tag1").ExactMatch().Count(), Is.EqualTo(1)); + Assert.That(_searchBuilder.WithField("tag-value", "Tag1").ExactMatch().Count(), Is.EqualTo(1)); + } + + [Test] + public void NotAnalyzedFieldsAreSearchable() { + _provider.CreateIndex("default"); + var documentIndex = _provider.New(1) + .Add("tag-id", 1) + .Add("tag-valueL", "tag1") + .Add("tag-valueU", "Tag1"); + + _provider.Store("default", documentIndex); + + // a value which is not analyzed, is not lowered cased in the index + Assert.That(_searchBuilder.WithField("tag-valueL", "tag").Count(), Is.EqualTo(1)); + Assert.That(_searchBuilder.WithField("tag-valueU", "tag").Count(), Is.EqualTo(0)); + Assert.That(_searchBuilder.WithField("tag-valueL", "Tag").Count(), Is.EqualTo(1)); // queried term is lower cased + Assert.That(_searchBuilder.WithField("tag-valueU", "Tag").Count(), Is.EqualTo(0)); // queried term is lower cased + Assert.That(_searchBuilder.WithField("tag-valueL", "tag1").ExactMatch().Count(), Is.EqualTo(1)); + Assert.That(_searchBuilder.WithField("tag-valueU", "tag1").ExactMatch().Count(), Is.EqualTo(0)); + } [Test] public void ShouldReturnAllDocuments() { diff --git a/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs b/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs index 42ebb12d5..a12cf3131 100644 --- a/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs +++ b/src/Orchard.Web/Core/Common/Handlers/CommonPartHandler.cs @@ -49,8 +49,8 @@ namespace Orchard.Core.Common.Handlers { OnPublishing>(AssignPublishingDates); OnIndexing((context, commonPart) => context.DocumentIndex - .Add("type", commonPart.ContentItem.ContentType).Store() - .Add("author", commonPart.Owner.UserName).Store() + .Add("type", commonPart.ContentItem.ContentType).Analyze().Store() + .Add("author", commonPart.Owner.UserName).Analyze().Store() .Add("created", commonPart.CreatedUtc ?? _clock.UtcNow).Store() .Add("published", commonPart.PublishedUtc ?? _clock.UtcNow).Store() .Add("modified", commonPart.ModifiedUtc ?? _clock.UtcNow).Store() diff --git a/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs b/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs index fd084120b..22f08bdee 100644 --- a/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs +++ b/src/Orchard.Web/Modules/Lucene/Services/LuceneSearchBuilder.cs @@ -103,7 +103,7 @@ namespace Lucene.Services { public ISearchBuilder WithField(string field, bool value) { CreatePendingClause(); - _query = new TermQuery(new Term(field, value.ToString())); + _query = new TermQuery(new Term(field, value.ToString().ToLower())); return this; } @@ -121,7 +121,7 @@ namespace Lucene.Services { public ISearchBuilder WithinRange(string field, string min, string max) { CreatePendingClause(); - _query = new TermRangeQuery(field, QueryParser.Escape(min.ToLower()), QueryParser.Escape(min.ToLower()), true, true); + _query = new TermRangeQuery(field, QueryParser.Escape(min.ToLower()), QueryParser.Escape(max.ToLower()), true, true); return this; } @@ -177,7 +177,9 @@ namespace Lucene.Services { if(!_exactMatch) { var termQuery = _query as TermQuery; if(termQuery != null) { - _query = new PrefixQuery(termQuery.GetTerm()); + var term = termQuery.GetTerm(); + // prefixed queries are case sensitive + _query = new PrefixQuery(term); } } if ( _asFilter ) { diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Handlers/TagsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Tags/Handlers/TagsPartHandler.cs index c91ad057d..a7f5d1e87 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Handlers/TagsPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Handlers/TagsPartHandler.cs @@ -13,8 +13,12 @@ namespace Orchard.Tags.Handlers { OnRemoved((context, tags) => tagService.RemoveTagsForContentItem(context.ContentItem)); - OnIndexing((context, tagsPart) => - context.DocumentIndex.Add("tags", String.Join(", ", tagsPart.CurrentTags.Select(t => t.TagName))).Analyze()); + OnIndexing( + (context, tagsPart) => { + foreach (var tag in tagsPart.CurrentTags) { + context.DocumentIndex.Add("tags", tag.TagName).Analyze(); + } + }); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Orchard.Web.csproj b/src/Orchard.Web/Orchard.Web.csproj index b04239903..0316a04a7 100644 --- a/src/Orchard.Web/Orchard.Web.csproj +++ b/src/Orchard.Web/Orchard.Web.csproj @@ -201,7 +201,7 @@ - False + True False 30320 /OrchardLocal