Lucene: изменение разделителя фасетов по умолчанию? - PullRequest
1 голос
/ 13 января 2012

Первое сообщение на этом замечательном сайте!

Моя цель - использовать иерархические аспекты для поиска в индексе с помощью Lucene.Тем не менее, мои грани должны быть разделены символом, отличным от '/', (в данном случае '~').Пример:

Категории Категории ~ Категории1 Категории ~ Категория2

Я создал класс, который реализует интерфейс FacetIndexingParams (копия DefaultFacetIndexingParams с параметром DEFAULT_FACET_DELIM_CHAR, установленным в '~').

Перефразированный индексный код: (используя FSDirectory как для индекса, так и для таксономии)

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_34)
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, analyzer)
IndexWriter writer = new IndexWriter(indexDir, config)
TaxonomyWriter taxo = new LuceneTaxonomyWriter(taxDir, OpenMode.CREATE)

Document doc = new Document()
// Add bunch of Fields... hidden for the sake of brevity
List<CategoryPath> categories = new ArrayList<CategoryPath>()
row.tags.split('\\|').each{ tag ->
    def cp = new CategoryPath()
    tag.split('~').each{
        cp.add(it)
    }
    categories.add(cp)
}
NewFacetIndexingParams facetIndexingParams = new NewFacetIndexingParams()
DocumentBuilder categoryDocBuilder = new CategoryDocumentBuilder(taxo, facetIndexingParams)
categoryDocBuilder.setCategoryPaths(categories).build(doc)
writer.addDocument(doc)

// Commit and close both writer and taxo.

Код поиска перефразированный:

// Create index and taxonomoy readers to get info from index and taxonomy
IndexReader indexReader = IndexReader.open(indexDir)
TaxonomyReader taxo = new LuceneTaxonomyReader(taxDir)
Searcher searcher = new IndexSearcher(indexReader)

QueryParser parser = new QueryParser(Version.LUCENE_34, "content", new StandardAnalyzer(Version.LUCENE_34))
parser.setAllowLeadingWildcard(true)
Query q = parser.parse(query)
TopScoreDocCollector tdc = TopScoreDocCollector.create(10, true)
List<FacetResult> res = null
NewFacetIndexingParams facetIndexingParams = new NewFacetIndexingParams()
FacetSearchParams facetSearchParams = new FacetSearchParams(facetIndexingParams)
CountFacetRequest cfr = new CountFacetRequest(new CategoryPath(""), 99)
cfr.setDepth(2)
cfr.setSortBy(SortBy.VALUE)
facetSearchParams.addFacetRequest(cfr)
FacetsCollector facetsCollector = new FacetsCollector(facetSearchParams, indexReader, taxo)

def cp = new CategoryPath("Category~Category1", (char)'~')
searcher.search(DrillDown.query(q, cp), MultiCollector.wrap(tdc, facetsCollector))

Результаты всегда возвращают список фасетов в виде "Category / Category1 ".

Я использовал инструмент Luke для просмотра индекса, и кажется, что грани ограничиваются символом '~' в индексе.

Что лучшемаршрут для этого?Любая помощь с благодарностью!

1 Ответ

3 голосов
/ 17 января 2012

Я выяснил проблему.Поиск и индексация работают так, как они должны.Проблема в том, как я получил побочные эффекты.Я использовал:

res = facetsCollector.getFacetResults()
res.each{ result ->
    result.getFacetResultNode().getLabel().toString()
}

То, что мне нужно было использовать:

res = facetsCollector.getFacetResults()
res.each{ result ->
    result.getFacetResultNode().getLabel().toString((char)'~')
}

Разница в том, что параметр был отправлен в функцию toString!

Легко пропуститьтрудно найти.

Надеюсь, это поможет другим.

...