Hybris solr 查询数据详细过程

  1. DefaultSolrProductSearchFacade 是所有搜索的起点类
    DefaultSolrProductSearchService 中包含对搜索的操作步骤: 调用创建searchQuery请求对象,发起solr服务器请求,对solr服务器响应内容解析。 其中的decodeState 方法调用 SolrSearchQueryDecoderPopulator ,对需要搜的value继续按 ":" 
    分组加到 SolrSearchQueryData 的过滤条件中filterTerms 并将第一个值放到setFreeTextSearch 第二个放到sort中

  2. SolrSearchQueryData 和 SearchQueryPageableData 通过SearchQueryPageableConverter 变成SolrSearchRequest

3.SearchQueryPageableConverter 的处理过程:
3.1 SolrSearchRequest的FacetSearchConfig来自 SearchSolrQueryPopulator 创建 在SolrSearchRequest.setSearchQuery SearchQuery 对象, DefaultFacetSearchConfigService 转换SolrFacetSearchConfigModel 成FacetSearchConfig
通过 DefaultFacetSearchConfigPopulator 转换,填充SearchConfig,SolrConfig,IndexConfig 三个类型。
如果有freeTextSearch则会在SearchQuery中添加UserQuery 另外默认启用Spellcheck

3.2 SearchPagePopulator 设置 SearchQuery的当前页和每页最大结果集大小

3.3 SearchSortPopulator 设置排序信息
SolrSearchRequest 的当前排序规则根据 
1.如果当前page中sort字段有则用该字段到IndexedType的排序字段中获取到IndexedTypeSort
2.如果有page,SearchQueryData 有sort则重新赋值SearchQueryData的sort获取到IndexedTypeSort 
3.当前的currentsort如果没值,则根据indextype的sort字段和IndexedProperties检查一下看是否在索引中。有的话就取第一个座位sort
4.如果CurrentSort有值 则在SearchQuery添加IndexedTypeSort的属性字段。

3.4 SearchTextPopulator 过滤要搜索文本字串 加上要查的solr力度是那些字段。
要搜索文档中的 : 替换为' ' AND OR 换成and or SolrSearchRequest的setSearchText 为过滤后的文本
根据空格分隔成单词 和配置要搜的 freeTextQueryBuilders 如 code,name,shortName,brandName,origin,categoryName等 获取到IndexedProperty
根据所配置的权重 和 indexedProperty 用OR 添加到 searchInField中
首先添加的是全字符串2倍配置权重,然后是根据空格分隔的单词是默认权重
如果是text类型的话会添加全字,空格分隔的字段, * 后词匹配 和 ~ (模糊匹配) 分别是默认权重,2分之一,4分之一权重

3.5 SearchFiltersPopulator 添加过滤条件
根据SearchQueryData得到FilterTerms 获取到IndexedProperty 得到正确的在索引中的IndexedProperty
然后将这些字段加到 SearchQuery 的FacetValue中
如果有CategoryCode ,将allCategories 添加到Facet中,并附上code

3.6: SearchExcludeProductsPopulator (无)
添加排除条件,主要排除某些code
3.7:BoostSearchQueryPopulator 添加返回权重
先获取categoryCode的权重, 根据categorycode 拿到该category的明星商品, 并赋值最大boot
根据categorycode拿到所有父目录(深度优先)的权重 searchQuery
3.8:ConditionalSortFilteringIndexedTypePopulator
添加按查询solr配置上的排序条件。如果有有ConditionalSolrSort 根据目录判别排序条件

3.9:SolrFacetReconfigurationPopulator

 CommerceIndexedTypePopulator 得SolrIndexedTypeModel的sort信息,转换为  IndexedType的sort

4.SolrSearchRequestResponsePopulator (用searchQuery 查询solr server) 
4.1 DefaultFacetSearchService 检查SearchQuery 是否包含语言 汇率 CatalogVersions 无的话从usersession中取
根据 config 拿出是solr何种模式:SolrServiceEmbeddedImpl SolrServiceStandaloneImpl
然后开始调用:queryInternal 
DefaultSolrQueryConverter 转换SearchQuery 到solrj的SolrQuery ,translateFieldName 字段将solr配置字段转成solr服务器中存储的字段根据DefaultFieldNameProvider
首先拿到所有facet在solr里的字段,然后catalog信息 。rangeset是string类型
分离查询字段和过滤字段
如果QueryField字段是facet会把字段操作变成or
convertResponse 分离获取group 或者facet值 变成SolrSearchRequest
然后将QueryResponse 转换成SolrSearchResult过程中会填充group 和facet数据
最后 DefaultSolrKeywordRedirectService 添加 attachKeywordRedirect 信息

5.SearchResponseConverter 从SolrSearchResponse 转变成ProductCategorySearchPageData
5.1 SearchResponseQueryPopulator 创建SolrSearchQueryData 查询对象,回填查询条件等
5.2 SearchResponsePaginationPopulator 创建PaginationData数据
5.3 SearchResponseResultsPopulator 转换group 内容 创建SolrDocumentData 数据
5.4 SearchResponseFacetsPopulator 创建FacetData数据
5.5 SearchResponseConditionalFacetFilterPopulator 和SearchResponseFacetFilterPopulator 过滤facet数据 
5.6 SearchResponseFacetSortPopulator facet排个序
5.7 SearchResponseBreadcrumbsPopulator 创建BreadcrumbData
5.8 SearchResponseSortsPopulator 创建SortData
5.9 SearchResponseFreeTextSearchPopulator 设置freetextsearch 
5.10 SearchResponseCategoryCodePopulator 设置categorycode
5.11 SearchResponseSubCategoriesPopulator 设置子目录,根据facet categoryPath 来切分
5.12 SearchResponseSpellingSuggestionPopulator 创建 spellingSuggestionData 获取getSpellCheck 的内容
5.13 SearchResponseKeywordRedirectPopulator setKeywordRedirects 的url 用KeywordRedirectUrlResolver 如 CategoryKeywordRedirectUrlResolver
5.14 FacetVisibilityRulePopulator 过滤facet 数据

完成查询返回 ProductCategorySearchPageData

最后前台显示用的 ProductData 对象在后面的ProductCategorySearchPagePopulator 中的SearchResultProductPopulator来转换出来。

猜你喜欢

转载自blog.csdn.net/weixin_42772369/article/details/82116163