lucene使用facet搜尋

2021-08-28 05:09:45 字數 3974 閱讀 2959

facet,英文翻譯為方面。lucene中的facet查詢其實就是對事物的方面查詢。我們以手機舉例。乙個手機可以有品牌,型號,運營商等多個facet,不同的facet型別可以組合成不同的手機或者手機的集合。如品牌為小公尺,運營商為移動構成的就是移動發行的所有小公尺的手機型號(小公尺1,小公尺2,小公尺3)等。而品牌為小公尺,型號為小公尺4構成的手機集合就是小公尺四的所有運營商發行版(小公尺4移動版,小公尺4聯通版,小公尺4電信版等)。我們在對一樣事物的搜尋時也時常使用這種方式,先確定手機品牌,再逐步對型號,運營商等方面進行限制最終得到想要的結果。下面介紹怎麼在lucene中如何使用facet

1.引入相關依賴

org.apache.lucene

lucene-facet

7.2.1

2.建立普通索引的同時建立taxonomyindex(分類索引)

@test

public void buildindex() throws exception

3.按維度進行細分查詢,同時獲取維度相關資訊

/**

* 對facet查詢進行測試

* @throws exception

*/@test

public void testfacetsearch() throws exception

system.out.println("********************===");

down,品牌選小公尺

system.out.println("-----小公尺手機-----");

drilldownquery drilldownquery = new drilldownquery(config, query);

drilldownquery.add("brand", "小公尺");

facetscollector fc1 = new facetscollector();//要new新collector,否則會累加

docs = facetscollector.search(searcher, drilldownquery, 10, fc1);

printdocs(docs, searcher);

system.out.println("----------facet-----------");

facets = new fasttaxonomyfacetcounts(taxoreader, config, fc1);

results = facets.getalldims(10);

//獲得小公尺手機的分布,總數2個,網路:移動4g 1個,聯通4g 1個

for (facetresult tmp : results)

system.out.println("********************===");

down,在brand這個facet選擇了小公尺之後繼續選擇另乙個方面network為移動4g

system.out.println("-----移動4g小公尺手機-----");

//可以看到使用的是同乙個drilldownquery

drilldownquery.add("network", "移動4g");

facetscollector fc2 = new facetscollector();

docs = facetscollector.search(searcher, drilldownquery, 10, fc2);

printdocs(docs, searcher);

system.out.println("----------facet-----------");

facets = new fasttaxonomyfacetcounts(taxoreader, config, fc2);

results = facets.getalldims(10);

for (facetresult tmp : results)

system.out.println("********************===");

//使用sideway檢視其它平行維度的資訊

system.out.println("-----小公尺手機drill sideways-----");

drillsideways ds = new drillsideways(searcher, config, taxoreader);

drilldownquery drilldownquery1 = new drilldownquery(config, query);

drilldownquery1.add("brand", "小公尺");

drillsideways.drillsidewaysresult result = ds.search(drilldownquery1, 10);

docs = result.hits;

printdocs(docs, searcher);

system.out.println("----------facet-----------");

results = result.facets.getalldims(10);

for (facetresult tmp : results)

system.out.println("********************===");

indexreader.close();

taxoreader.close();

}

查詢結果如下所示,可以看到隨著維度的細分查詢結果逐漸精確

---------手機----------

device:手機

name:公尺1

device:手機

name:公尺4

device:手機

name:榮耀6

----------facet-----------

dim=brand path= value=3 childcount=2

小公尺 (2)

華為 (1)

dim=network path= value=3 childcount=2

移動4g (2)

聯通4g (1)

********************===

-----小公尺手機-----

device:手機

name:公尺1

device:手機

name:公尺4

----------facet-----------

dim=brand path= value=2 childcount=1

小公尺 (2)

dim=network path= value=2 childcount=2

移動4g (1)

聯通4g (1)

********************===

-----移動4g小公尺手機-----

device:手機

name:公尺1

----------facet-----------

dim=brand path= value=1 childcount=1

小公尺 (1)

dim=network path= value=1 childcount=1

移動4g (1)

********************===

-----小公尺手機drill sideways-----

device:手機

name:公尺1

device:手機

name:公尺4

----------facet-----------

dim=brand path= value=3 childcount=2

小公尺 (2)

華為 (1)

dim=network path= value=2 childcount=2

移動4g (1)

聯通4g (1)

********************===

Lucene使用Filter搜尋過濾

排序查詢 param querystr 查詢匹配的字串 param domain 查詢內容的域 param filter 過濾器 public void searchbyfilter string querystr,string domain,filter filter else 輸出資訊 scor...

使用lucene對搜尋結果排序

lucene預設根據匹配度對搜尋結果降序排,如果對某個域進行排序?通常分兩步 step1 建索引時 newfield audittime row.get audittime tostring 關鍵點是你需要排序的字段建索引時應該採用 field.index.un tokenized,至於需不需要 f...

使用lucene對搜尋結果排序

lucene預設根據匹配度對搜尋結果降序排,如果對某個域進行排序?通常分兩步 step1 建索引時 newfield audittime row.get audittime tostring 關鍵點是你需要排序的字段建索引時應該採用 field.index.un tokenized,至於需不需要 f...