1. 程式人生 > >Hybris solr 查詢資料詳細過程

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來轉換出來。