Поиск в Examine игнорирует определенные ключевые слова или мой запрос неверен? - PullRequest
1 голос
/ 10 мая 2019

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

Например, я ищу countryCode = IN и startCity = New Delhi

Я передаю список обязательных свойств (ОБЯЗАТЕЛЬНЫЕ свойства):

List<string> matchProperties =  new List<string> { countryCode = "IN", startCity = "New Delhi" };

Но проверка строит запрос следующим образом:

SearchIndexType: "content", LuceneQuery: {+(__NodeTypeAlias:product +startCity:"new delhi" -umbracoNaviHide:1) +__IndexType:content}

, очевидно, игнорируя countryCode IN значение

То же самое, если я ищу только по стране:

List<string> matchProperties =  new List<string> { countryCode = "IN" };

Я получаю следующий запрос:

SearchIndexType: "content", LuceneQuery: {+(__NodeTypeAlias:product -umbracoNaviHide:1) +__IndexType:content}

Здесь я получаю неправильные результаты, потому чтопоиск возвращает все product узлы вместо тех, которые содержат IN countryCode.

Если я посмотрю по ключевому слову (оно использует свойства Or, поэтому должно возвращать продукты, когда любое из полей содержит ключевое слово), этовключается в запрос:

SearchIndexType: "content", LuceneQuery: {+(__NodeTypeAlias:product heading:danakil tags:danakil description:danakil -umbracoNaviHide:1) +__IndexType:content}

, но он снова возвращает все узлы, что неверно, поскольку FOR SURE, только несколько узлов (до 20) содержат это конкретное слово (с учетом регистра или нет).

Но если я буду искать по фальшивому / несловесному ключуслово напримерasdadasda:

List<string> matchOrProperties =  new List<string> { keyword = "asdadasda" };

он также игнорируется в запросе (аналогично IN выше):

SearchIndexType: "content", LuceneQuery: {+(__NodeTypeAlias:product -umbracoNaviHide:1) +__IndexType:content}

и возвращает все узлы вместо 0 узлов.

Вот как я строю свой запрос:

    protected async Task<List<SearchResult>> SearchCriteriaResultAsync(Examine.Providers.BaseSearchProvider searcher, ISearchCriteria searchCriteria, string contentAliasToMatch, bool excludeHidden, Dictionary<string, string> matchProperties, Dictionary<string, string> matchOrProperties)
    {
        IBooleanOperation query = searchCriteria.NodeTypeAlias(contentAliasToMatch);

        if (matchProperties != null && matchProperties.Any())
        {
            foreach (var item in matchProperties)
            {
                query = query.And().Field(item.Key, item.Value);
            }
        }

        if (matchOrProperties != null && matchOrProperties.Any())
        {
            int counter = 0;
            foreach (var item in matchOrProperties)
            {
                query = query.Or().Field(item.Key, item.Value);
                counter++;
            }
        }

        if(excludeHidden)
        {
            query = query.Not().Field("umbracoNaviHide", "1");
        }

        return await System.Threading.Tasks.Task.Run(() => {
            return searcher.Search(query.Compile()).ToList();
        });
    }

А мой индексатор и поисковик:

    <add name="PublishedProductsIndexer" type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine"
         supportUnpublished="false"
         supportProtected="true"
         interval="10"
         analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"/>



    <add name="PublishedProductsSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine"
         analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"/>



<IndexSet SetName="PublishedProductsIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/PublishedProducts/" IndexParentId="1049">
    <IndexAttributeFields>
        <add Name="id" />
        <add Name="nodeName" />
        <add Name="updateDate" />
        <add Name="writerName" />
        <add Name="path" />
        <add Name="email" />
        <add Name="nodeTypeAlias" />
        <add Name="parentID" />
    </IndexAttributeFields>
    <IncludeNodeTypes>
        <add Name="product"/>
    </IncludeNodeTypes>
</IndexSet>

Игнорирует ли Examine определенные ключевые слова или мой запрос неверен?Если не так, как мне это исправить?

Я использую umbraco 7.6, если это имеет значение.

...