Использование Examine Manager для поиска контента

1

Это первый раз, когда я использовал Examine. Пока это работает, переменная results имеет правильные данные, однако то, что я хочу сделать, это добавить переменную searchTerm Я хочу искать все поля всех узлов, которые в настоящее время возвращаются в results

Есть идеи? - Заранее спасибо.

var searchEngine = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"];
var criteria = searchEngine.CreateSearchCriteria(BooleanOperation.Or);

IBooleanOperation query = criteria.NodeTypeAlias("level1")
.Or().NodeTypeAlias("level2")
.Or().NodeTypeAlias("simpleTextPage")
.Or().NodeTypeAlias("contactPage")
.Or().NodeTypeAlias("Locationfinder");

string searchTerm = "Term to Search for here";

var results = searchEngine.Search(query.Compile());
Теги:
lucene
umbraco
examine

1 ответ

3
Лучший ответ

На этот ответ есть две части. Во-первых, вам нужно указать, какие поля вы хотите искать:

.Or().Field("bodyText", searchTerm)

Это делает предположение, что ваши страницы имеют свойство bodyText. Вы можете добавлять дополнительные поля к этому, чтобы искать другие свойства, например имя, introText и т.д.

Во-вторых, если вы хотите искать по всем полям, вам нужно будет создать поле, содержащее весь текстовый контент с индексируемой страницы. Тебе нужно:

  1. Создайте событие Umbraco, которое реализует IApplicationEventHandler;
  2. Добавить обработчик для сбора данных узла:

    void OnApplicationStarted(UmbracoApplicationBase app, ApplicationContext ctx)
    {
        ExamineManager.Instance
                      .IndexProviderCollection["ExternalIndexer"]
                      .GatheringNodeData += OnGatheringNodeData;
    }
    
  3. Создайте комбинированное поле:

    protected void OnGatheringNodeData(object sender, IndexingNodeDataEventArgs e)
    {
        var builder = new StringBuilder();
        foreach (var entry in e.Fields)
        {
            builder.AppendFormat("{0}, ", entry.Value);
        }
    
        e.Fields.Add("combinedText", builder.ToString());
    }
    
    1. Измените свой поиск на .Or().Field("combinedText", searchTerm);

Теперь каждый раз, когда публикуется страница, она объединяет все поля в одну, чтобы их можно было искать так, как вы хотите.

Однако, лично, я бы посоветовал вам выбирать конкретные поля для объединения, поскольку редко требуется комбинировать все. Обычно это знак того, что в ваших типах документов мало согласованности. Я всегда использую общие псевдонимы во всех моих типах документов по таким причинам, как bodyText, introText, summaryText и т.д. Таким образом, при необходимости я могу отфильтровать поля, заканчивающиеся на "Текст", или мои псевдонимы как статические строки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню