Umbraco Examine, несколько вложенных логических операторов

Я пытаюсь добавить эти фильтры к уже разумному сложному запросу Umbraco Examine и вижу, что вы не можете смешивать API с необработанным запросом lucene, поэтому все это, возможно, придется делать необработанным, чего я пытался избежать с тех пор это построитель запросов, который имеет довольно много измерений.

Возможно ли такое с помощью API? Я видел GroupedOr/And, но не понимаю, как это сокращается, поскольку это эксклюзивные/включающие запросы типа sql "In".

AND ((_nodeTypAlias: 'Event' AND eventDate:(0xx TO 0xx)) OR (NOT _nodeTypAlias: 'Event'))
AND ((_nodeTypAlias: 'Article' AND postDate:(0xx TO 0xx)) OR (NOT _nodeTypAlias: 'Article'))

person jenson-button-event    schedule 04.07.2017    source источник


Ответы (1)


Этого удалось добиться с помощью превосходного API конструктора запросов Lucence.

    var q = new QueryBuilder()
            .Must
            .MatchSubQuery(and => and
                .Should
                .MatchSubQuery(qq => qq
                    .Must
                    .MatchTerm("__NodeTypAlias", "Event")
                    .MatchRange(
                        "comparableEventDate",
                        DateTime.Now.ToString("yyyyMMddHHmm00000"),
                        DateTime.Now.AddYears(100).ToString("yyyyMMddHHmm00000"))
                .MatchSubQuery(qq => qq
                    .MustNot
                    .MatchTerm("__NodeTypAlias", "Event"))
            )
            .Query
            .ToString();

Выходы:

+((+__NodeTypAlias:Event +eventDate:[42920 TO 79444]) (-__NodeTypAlias:Event))

и передайте это в Umbraco Examine:

ISearchCriteria criteria = searcher.CreateSearchCriteria();
var filter = criteria.RawQuery(q);
var results = searcher.Search(filter, MaxResults);

Оператор Should переводится как «ИЛИ», а Must переводится как «И» (номенклатура Lucene).

Для справки вам также необходимо записать новые сопоставимые поля даты в индекс при сборе данных узла:

    private void ExamineEvents_GatheringNodeData(object sender, IndexingNodeDataEventArgs e, UmbracoHelper umbraco)
    {
        if (e.IndexType != IndexTypes.Content) return;

        try
        {
            var content = new Node(e.NodeId);
            if (e.Fields.ContainsKey("postDate"))
                e.Fields.Add("comparablePostDate", DateTime.Parse(e.Fields["postDate"]).ToString("yyyyMMddHHmm00000"));
            if (e.Fields.ContainsKey("eventDate"))
                e.Fields.Add("comparableEventDate", DateTime.Parse(e.Fields["eventDate"]).ToString("yyyyMMddHHmm00000"));


            AddAuthor(e.Fields, content);
        }
        catch (Exception ex)
        {
            LogHelper.Error(this.GetType(), "Error in Umbers custom ExamineEvents_GatheringNodeData: ", ex);
            //does nowt!
            throw;
        }
    }
person jenson-button-event    schedule 04.07.2017