mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-21 03:14:10 +08:00
Added search fields administration
--HG-- branch : dev
This commit is contained in:
@@ -144,11 +144,11 @@ namespace Orchard.Indexing.Services {
|
||||
current = indexDocument;
|
||||
var doc = CreateDocument(indexDocument);
|
||||
writer.AddDocument(doc);
|
||||
Logger.Debug("Document [{0}] indexed", indexDocument.Id);
|
||||
Logger.Debug("Document [{0}] indexed", indexDocument.ContentItemId);
|
||||
}
|
||||
}
|
||||
catch ( Exception ex ) {
|
||||
Logger.Error(ex, "An unexpected error occured while add the document [{0}] from the index [{1}].", current.Id, indexName);
|
||||
Logger.Error(ex, "An unexpected error occured while add the document [{0}] from the index [{1}].", current.ContentItemId, indexName);
|
||||
}
|
||||
finally {
|
||||
writer.Optimize();
|
||||
@@ -229,5 +229,19 @@ namespace Orchard.Indexing.Services {
|
||||
doc.Save(settingsFileName);
|
||||
}
|
||||
|
||||
public string[] GetFields(string indexName) {
|
||||
if ( !Exists(indexName) ) {
|
||||
return new string[0];
|
||||
}
|
||||
|
||||
var reader = IndexReader.Open(GetDirectory(indexName), true);
|
||||
|
||||
try {
|
||||
return reader.GetFieldNames(IndexReader.FieldOption.ALL).ToArray();
|
||||
}
|
||||
finally {
|
||||
reader.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -3,7 +3,6 @@ using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using Lucene.Net.Analysis;
|
||||
using Lucene.Net.Analysis.Tokenattributes;
|
||||
using Lucene.Net.Index;
|
||||
using Lucene.Net.Search;
|
||||
using Lucene.Net.Store;
|
||||
@@ -20,15 +19,12 @@ namespace Orchard.Indexing.Services {
|
||||
private readonly Directory _directory;
|
||||
|
||||
private readonly List<BooleanClause> _clauses;
|
||||
private readonly List<BooleanClause> _filters;
|
||||
private int _count;
|
||||
private int _skip;
|
||||
private readonly Dictionary<string, DateTime> _before;
|
||||
private readonly Dictionary<string, DateTime> _after;
|
||||
private string _sort;
|
||||
private bool _sortDescending;
|
||||
private string _parse;
|
||||
private readonly Analyzer _analyzer;
|
||||
private string[] _defaultFields;
|
||||
private bool _asFilter;
|
||||
|
||||
// pending clause attributes
|
||||
private BooleanClause.Occur _occur;
|
||||
@@ -44,13 +40,10 @@ namespace Orchard.Indexing.Services {
|
||||
|
||||
_count = MaxResults;
|
||||
_skip = 0;
|
||||
_before = new Dictionary<string, DateTime>();
|
||||
_after = new Dictionary<string, DateTime>();
|
||||
_clauses = new List<BooleanClause>();
|
||||
_filters = new List<BooleanClause>();
|
||||
_sort = String.Empty;
|
||||
_sortDescending = true;
|
||||
_parse = String.Empty;
|
||||
_analyzer = LuceneIndexProvider.CreateAnalyzer();
|
||||
|
||||
InitPendingClause();
|
||||
}
|
||||
@@ -67,8 +60,13 @@ namespace Orchard.Indexing.Services {
|
||||
throw new ArgumentException("Query can't be empty");
|
||||
}
|
||||
|
||||
_defaultFields = defaultFields;
|
||||
_parse = 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);
|
||||
_clauses.Add(clause);
|
||||
}
|
||||
|
||||
_query = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -155,6 +153,7 @@ namespace Orchard.Indexing.Services {
|
||||
_exactMatch = false;
|
||||
_query = null;
|
||||
_boost = 0;
|
||||
_asFilter = false;
|
||||
}
|
||||
|
||||
private void CreatePendingClause() {
|
||||
@@ -172,8 +171,12 @@ namespace Orchard.Indexing.Services {
|
||||
_query = new PrefixQuery(termQuery.GetTerm());
|
||||
}
|
||||
}
|
||||
|
||||
_clauses.Add(new BooleanClause(_query, _occur));
|
||||
if ( _asFilter ) {
|
||||
_filters.Add(new BooleanClause(_query, _occur));
|
||||
}
|
||||
else {
|
||||
_clauses.Add(new BooleanClause(_query, _occur));
|
||||
}
|
||||
}
|
||||
|
||||
public ISearchBuilder SortBy(string name) {
|
||||
@@ -186,6 +189,11 @@ namespace Orchard.Indexing.Services {
|
||||
return this;
|
||||
}
|
||||
|
||||
public ISearchBuilder AsFilter() {
|
||||
_asFilter = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ISearchBuilder Slice(int skip, int count) {
|
||||
if ( skip < 0 ) {
|
||||
throw new ArgumentException("Skip must be greater or equal to zero");
|
||||
@@ -206,23 +214,27 @@ namespace Orchard.Indexing.Services {
|
||||
|
||||
var query = new BooleanQuery();
|
||||
|
||||
if(!String.IsNullOrWhiteSpace(_parse)) {
|
||||
|
||||
foreach ( var defaultField in _defaultFields ) {
|
||||
var clause = new BooleanClause(new QueryParser(LuceneIndexProvider.LuceneVersion, defaultField, LuceneIndexProvider.CreateAnalyzer()).Parse(_parse), BooleanClause.Occur.SHOULD);
|
||||
query.Add(clause);
|
||||
}
|
||||
}
|
||||
|
||||
foreach( var clause in _clauses)
|
||||
query.Add(clause);
|
||||
|
||||
|
||||
if ( query.Clauses().Count == 0 ) { // get all documents ?
|
||||
query.Add(new TermRangeQuery("id", "0", "9", true, true), BooleanClause.Occur.SHOULD);
|
||||
}
|
||||
|
||||
Logger.Debug("New search query: {0}", query.ToString());
|
||||
return query;
|
||||
Query finalQuery = query;
|
||||
|
||||
if(_filters.Count > 0) {
|
||||
var filter = new BooleanQuery();
|
||||
foreach( var clause in _filters)
|
||||
filter.Add(clause);
|
||||
var queryFilter = new QueryWrapperFilter(filter);
|
||||
|
||||
finalQuery = new FilteredQuery(query, queryFilter);
|
||||
}
|
||||
|
||||
Logger.Debug("New search query: {0}", finalQuery.ToString());
|
||||
return finalQuery;
|
||||
}
|
||||
|
||||
public IEnumerable<ISearchHit> Search() {
|
||||
|
Reference in New Issue
Block a user