我正在为Apache Solr开发一个非常简单的自定义SearchComponent
,它必须找到查询术语的同义词,并在找到的文档之外返回它们。为了获得同义词,我使用WordNet及其JWNL Java API。
我在Eclipse中使用JWNL教程中建议的代码创建了一个项目来启动字典:
try {
JWNL.initialize(new FileInputStream("properties.xml"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JWNLException e) {
e.printStackTrace();
}
final Dictionary dictionary = Dictionary.getInstance();
文件properties.xml
如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<jwnl_properties language="en">
<version publisher="Princeton" number="3.1" language="en"/>
<dictionary class="net.didion.jwnl.dictionary.FileBackedDictionary">
<param name="dictionary_element_factory"
value="net.didion.jwnl.princeton.data.PrincetonWN17FileDictionaryElementFactory"/>
<param name="file_manager" value="net.didion.jwnl.dictionary.file_manager.FileManagerImpl">
<param name="file_type" value="net.didion.jwnl.princeton.file.PrincetonRandomAccessDictionaryFile"/>
<param name="dictionary_path" value="/path/dict"/>
</param>
</dictionary>
<resource class="PrincetonResource"/>
</jwnl_properties>
在Eclipse中一切正常。如果我将包含所有必需库(Solr和JWNL)的项目导出到JAR文件并使用java -jar
从另一个位置的终端运行它,它也可以工作。
但是如果我将JAR放在我的Solr Core的lib
文件夹中以实现插件(在solrconfig.xml
文件中正确注册后)并尝试运行一个简单的查询,此错误出现在响应中:
java.lang.NullPointerException\n\tat sir.WordNetExpansionSearchComponent.process(WordNetExpansionSearchComponent.java:86)
引用这行代码:
indexWordN = dictionary.getIndexWord(POS.NOUN, term);
尽管初始化,我试图检查并且dictionary
似乎设置为null。这怎么可能?我该如何解决?
编辑1:
这是我注册插件的solrconfig.xml
代码段:
<!-- WordNet Query Expansion Search Component -->
<searchComponent class="sir.WordNetExpansionSearchComponent" name="wordnetExpansionSearchComponent">
</searchComponent>
<!-- A request handler for demonstrating the WordNet Query Expansion component -->
<requestHandler name="/expand" class="solr.SearchHandler">
<arr name="last-components">
<str>wordnetExpansionSearchComponent</str>
</arr>
</requestHandler>