我正在Umbraco中建立“检查搜索”,并按关键字,国家/地区代码或城市进行搜索,但其中某些搜索结果却是错误的。
例如,我搜索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}
但它再次返回所有节点,这是错误的,因为肯定只有几个节点(最多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>
检查是忽略某些关键字还是我的查询错误?如果错误,应该如何解决?
如果这很重要,我会使用umbraco 7.6。