我正在使用Atlassian Confluence,它使用Lucene作为searchengine。
我想将一个单词列表与特定的搜索词相关联。
示例:用户搜索“DNA”,然后我希望lucene在表中查看是否存在DNA字段...在DNA旁边是“DNS”(这是德语术语)。在此查找之后,lucene应该搜索DNA或DNS。
背景:我们公司是国际性的,丹麦人应该找到用德语写的内容。
我现在必须自己设置这些索引。多数民众赞成,只使用了一些特殊的词,所以我们可以处理这种关联。
答案 0 :(得分:0)
您可以在分析仪中使用SynonymFilter。
按照示例的片段搜索" DNS"每当你搜索" DNA"
SynonymMap.Builder sb = new SynonymMap.Builder ( true ); sb.add ( new CharsRef("DNA"), new CharsRef("DNS"), true ); // ...add here others synonyms SynonymMap synonymMap = sb.build();
public class SynonymAnalyzer extends Analyzer { public static final Version version = Version.LUCENE_47; private SynonymMap synonyms; public SynonymAnalyzer(SynonymMap synonyms) { setSynonyms(synonyms); } @Override protected TokenStreamComponents createComponents(String fieldName, Reader reader) { TokenStreamComponents result = null; WhitespaceTokenizer source = new WhitespaceTokenizer(version, reader); SynonymFilter filter = new SynonymFilter(source, getSynonyms(), true); result = new TokenStreamComponents(source, filter); return result; } public SynonymMap getSynonyms() { return synonyms; } protected void setSynonyms(SynonymMap synonyms) { this.synonyms = synonyms; } }
最后,当你搜索一个术语" DNA"并且您应用SynonymAnalyzer,查询将使用同义词进行扩展。
IndexReader reader = DirectoryReader.open ( yourIndex ); IndexSearcher searcher = new IndexSearcher ( reader ); SynonymAnalyzer analyzer = new SynonymAnalyzer ( synonymMap ); QueryParser query = new QueryParser ( version, "yourDftField", analyzer ); Query queryParsed = query.parse ( "DNA" ); TopDocs topDocs = searcher.search ( queryParsed, 10 );