使用 Lucene 搜索你的 beans — Suggest
作者来自 Elastic David Pilato到目前为止我们已经看到如何针对你映射的任意 field 运行 search query。任何熟悉 search engine 的人都知道下一步是什么autocomplete这样 index 就可以帮助你找到正确的 query。Autocomplete 有自己的 artifactdependency groupIdorg.apache.lucene/groupId artifactIdlucene-suggest/artifactId version10.5.1/version /dependency第二个 DirectoryAnalyzingInfixSuggester并不是针对 track index 的IndexSearcher。它是一个拥有自己Directory的dictionary。使用与之前相同的 analyzer这样 prefixes 才能匹配 titles 的 tokenization 方式Directory suggestionDirectory new ByteBuffersDirectory(); AnalyzingInfixSuggester suggester new AnalyzingInfixSuggester( suggestionDirectory, analyzer); suggester.build(new TrackSuggestionInputIterator(tracks.values()));将它放在 track writer 旁边在 rebuild / upsert 时使用相同的 write lock。对 infix suggester 执行增量 delete 比较麻烦对于几千个 beans可以在每次 mutation 后重建 dictionary。输入 “club”输入 prefixclub。将鼠标悬停在某一行上可以看到lookup()→highlightKey、field、FILTER chip。ListLookup.LookupResult matches suggester.lookup(club, Set.of(), 10, true, true); Lookup.LookupResult match matches.get(0); String text match.key.toString(); // Club House String field match.payload.utf8ToString(); // genre String highlight match.highlightKey.toString(); // bClub/b House这意味着第一个 suggestion 是来自genrefield 的Club House可以向用户呈现为ClubHouse。使用 suggestion 进行过滤选择Club Housefield genre后可以调用你的后端 search API/tracks?genreClub House并更新 UI 以反映所选的 filter chip。如果你希望 suggestions 遵循当前的 filter set请修改调用ListTrack scoped search.filter(corpus, , filters, mustNots); ListTrackSuggestion hits index.suggest(prefix, scoped);filter(..., , filters, mustNots)会应用当前已经启用的 chips并使用一个空的 query string。然后suggest(prefix, scoped)只会在这个子集内查找因此club不会推荐那些已被这些 chips 排除的 genre。完整 demo 位于 GitHublucene-search-tracks。原文Search your beans with Lucene — Suggest | David Pilato
上一篇/下一篇内容由系统自动关联
返回资讯列表 →