これはWebデータベースの重要なポイントであると認識しているため、この質問はマスターデータベースに当てはまります...
Sitecore6.4.1で次のようにカスタムインデックスを設定しています。
<index id="search_content_US" type="Sitecore.Search.Index, Sitecore.Kernel">
<param desc="name">$(id)</param>
<param desc="folder">_search_content_US</param>
<Analyzer ref="search/analyzer" />
<locations hint="list:AddCrawler">
<search_content_home type="Sitecore.Search.Crawlers.DatabaseCrawler, Sitecore.Kernel">
<Database>master</Database>
<Root>/sitecore/content/usa home</Root>
<Tags>home content</Tags>
</search_content_home>
</locations>
</index>
SortableIndexSearchContext
このようにインデックスをクエリします(この回答からtechphoria414を使用しています:新しいSitecore.Search APIを使用して並べ替え/フィルタリングする方法):
private SearchHits GetSearchResults(SortableIndexSearchContext searchContext, string searchTerm)
{
CombinedQuery query = new CombinedQuery();
query.Add(new FullTextQuery(searchTerm), QueryOccurance.Must);
return searchContext.Search(query, Sort.RELEVANCE);
}
...
SearchHits hits = GetSearchResults(searchContext, searchTerm);
hits
私のインデックスからの検索ヒットのコレクションです。繰り返してみるとhits
、Sitecoreには、アイテムのバージョンごとに1つずつ、同じアイテムの重複が多数あることがわかります。
次に、次のようにして:を取得しますSearchResultCollection
。
SearchResultCollection results = hits.FetchResults(0, hits.Length);
これにより、すべての複製が1つのSearchResult
オブジェクトに結合されます。このオブジェクトは、特定のアイテムの1つのバージョンを表し、他のすべてのアイテムバージョンを表すのSubResults
コレクションであるというプロパティがあります。SearchResult
これが私の問題です:
で表されるアイテムのバージョンは、現在公開されているアイテムのバージョンでSearchResult
はありません。ランダムに選択されたバージョンのようです(インデックスで最初にヒットした検索方法のいずれか)。ただし、最新バージョンはSubResults
コレクションに含まれています。
例えば:
SearchResult
|
|- Version 8 // main result
...
|- SubResults
|
|- Version 9 // latest version
|- Version 3
|- Version 5
... // all versions in random order
マスターデータベースでこれが発生しないようにするにはどうすればよいですか?Luceneが古いバージョンのアイテムにインデックスを付けるのを防ぐか、結果セットを操作して最新バージョンをSubResults
?
余談ですが、Luceneが古いバージョンのアイテムのインデックスを作成するのはなぜですか?古いバージョンが表示されないので、これはあなたのウェブサイトのコンテンツを検索するのに無意味ですか?