Portál AbcLinuxu, 5. května 2025 02:55
Svátky pomalu končí a tak mám pro vás poslední novinku pro tento týden. A tou je předělání vyhledávání - hezčí vzhled i ukázka nalezených dokumentů.
Po menších peripetiích jsem si stáhnul verzi modulu highlight, která je kompatibilní s verzi Lucene, kterou používám. Kupodivu to nebylo moc složité a máme zvýrazňování, tak jak jej znáte z googlu a spol. Přitom jsem předělal i vizuální podobu výsledků, aspoň mě to teď přijde hezčí. On si s tím určitě Robert pohraje.
Odstranil jsem skóre, které spíše mátlo než pomáhalo. Také jsem zmenšil počet výsledků na stránce, vlastní hodnotu si můžete nastavit v profilu. Já si ji zmenším.
Začal jsem indexovat datum vytvoření a poslední změny u všech objektů, zatím se mi ale nedaří podle nich hledat. Lépe jsem dopadl s tím, zda je diskuse vyřešena (vyreseno:ano/ne) a počtu odpovědí (odpovedi:cislo). Začal jsem psát i nápovědu, časem do ni přidám všechny informace.
Teď se zrovna reindexuje databáze, změny byly nekompatibilní a tak teď hledání padá. Ale za deset minut si můžete hrát. Později přidám do výpisu více informací, hlavně datum vytvoření a/nebo poslední změny, u diskusí pak hodnoty zmíněných políček. Kousek kódu pro programátory, sám jsem něco podobného ráno potřeboval, protože ukázka v dokumentaci modulu highlight není úplná.
AbcCzechAnalyzer analyzer = new AbcCzechAnalyzer(); Query query = AbcQueryParser.parse(queryString, analyzer, types, newsCategories); IndexReader indexReader = IndexReader.open(CreateIndex.getIndexPath()); query = query.rewrite(indexReader); Searcher searcher = new IndexSearcher(indexReader); Hits hits = searcher.search(query); int total = hits.length(); SimpleHTMLFormatter formatter = new SimpleHTMLFormatter( "<span class=\"highlight\">", "</span>"); Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query)); for ( int i=from,j=0; i<total && j<count; i++, j++ ) { Document doc = hits.doc(i); float score = (hits.score(i)>0.01) ? hits.score(i) : 0.01f; doc.add(Field.UnIndexed("score", percentFormat.format(score))); String text = hits.doc(i).get(MyDocument.CONTENT); TokenStream tokenStream = analyzer.tokenStream(MyDocument.CONTENT, new StringReader(text)); String result = highlighter.getBestFragments(tokenStream, text, 3, "..."); doc.add(Field.UnIndexed("fragments", result)); list.add(doc); }
Tiskni
Sdílej:
nvidia vytvoreno:[1.7.2005 TO 7.7.2005]
najde vsechno, co bylo vytvoreno v danem casovem useku a obsahuje slovo nvidia. U diskusi je lepsi pouzit policko zmeneno (pozor - je to datum posledni zmeny, ne ze v danem case se neco zmenilo).
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.