Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search Lucene通配符搜索_Search_Lucene - Fatal编程技术网

Search Lucene通配符搜索

Search Lucene通配符搜索,search,lucene,Search,Lucene,如何在Lucene中执行通配符搜索? 我有文字:“1997年泰坦尼克号” 如果我像“1997_泰坦尼克号”一样搜索,它会返回一个结果,但我无法执行以下两个搜索: 1) 如果仅使用1997搜索,则不会返回任何结果。 2) 另外,如果有一个空间,比如在《蜘蛛侠》中,那是找不到任何结果的 我从数据库中检索所有电影信息并将其存储在Lucene文档中: 公共文档createMovieDoc(电影m){ 添加(新的StoredField(“moviename”,m.getName()); TextField

如何在Lucene中执行通配符搜索?
我有文字:“1997年泰坦尼克号”
如果我像“1997_泰坦尼克号”一样搜索,它会返回一个结果,但我无法执行以下两个搜索:

1) 如果仅使用1997搜索,则不会返回任何结果。
2) 另外,如果有一个空间,比如在《蜘蛛侠》中,那是找不到任何结果的

我从数据库中检索所有电影信息并将其存储在Lucene文档中:

公共文档createMovieDoc(电影m){
添加(新的StoredField(“moviename”,m.getName());
TextField=newtextfield(“movienameSearch”,m.getName().toLowerCase(),Store.NO);
字段。后退(5.0f);
文件。添加(字段);
}
要搜索,我有以下方法:

公共列表searh(字符串txt){
PhraseQuery phQuery=新建PhraseQuery();
术语=新术语(“movienameSearch”,txt.toLowerCase());
BooleanQuery b=新的BooleanQuery();
b、 添加(phQuery,occure.SHOULD);
TopFieldDocs tp=搜索者搜索(b,20,…);

对于(int i=0;i我不确定您使用的是什么分析器进行索引。听起来可能像是
WhitespaceAnalyzer
?听起来像是,当索引“1997_titanic”时,它仍然是一个单独的标记,而“蜘蛛侠”被分为标记“蜘蛛”和“人”

也可以是使用
字母标记器的
SimpleAnalyzer
。这将使搜索“1997”变得不可能,因为该标记器将消除文本索引表示的所有数字

您的搜索方法看起来不正确。您没有向
短语查询添加任何术语,因此我不希望它找到任何内容。您必须使用一些术语才能找到任何内容。您在提供的内容中创建了
术语,但从未对该术语进行过任何操作。可能这与您的工作方式有关选择你的摘录,或者什么?不确定,我有点困惑

为了手动构建短语查询,您必须单独添加每个术语,以便搜索“蜘蛛侠”,您可以执行以下操作:

PhraseQuery phQuery=新PhraseQuery();
添加(新术语(“movienameSearch”、“spider”);
添加(新术语(“movienameSearch”、“man”);
这要求您知道分析器在索引时正在做什么,并自己标记输入以适应。更简单的解决方案是只使用:

//使用您喜欢使用的任何分析器。
QueryParser解析器=新的QueryParser(Version.LUCENE_46,“defaultField”,analyzer);
Query Query=parser.parse(“movienameSearch:\”“+txt.toLowerCase()+”\”);
TopFieldDocs tp=searcher.search(查询,20);
这使您可以依赖同一个分析器来索引和查询,因此您不必知道如何标记短语以适应

至于单独查找“1997”和“泰坦尼克号”,我建议只使用。它将这些标记化为离散标记,允许非常轻松地搜索它们,只需使用以下简单查询:
movienameSearch:1997