Nutch在搜索时把自定义的字段(filed)加入检索条件
2011-04-20 15:31
405 查看
1[/b]、问题原因分析[/b]
错误org.apache.nutch.searcher.QueryException: Not a known field name:publishUrl原因
原因分析:
在NutchBean的main()方法中
声明NutchBean 得到一个bean,在他的构造函数中使用LuceneSearchBean()来实现searchBean。
LuceneSearchBean的构造函数调用自己的init()方法进行初始化。其中searcher的使用IndexSearher()进行实例化。
在IndexSearcher的构造函数中调中自己的()方法来初实例化queryFilters
QueryFIlters中有三个field
默认加载LanguageQueryFilte、DefaultQueryFilter
UrlQueryFilter、SiteQueryFilter四个插件
FIELD_NAMES中的值为[site, , lang, DEFAULT, url]
RAW_FIELD_NAMES中的值为[site, , lang]
在QueryFilter()的构造函数中会将FIELD_NAMES和RAW_FIELD_NAMES存入到ObjectCahche中
当执行到 final[/b] Hits hits = bean.search(query);时会调用searchBean.search(query);即LuceneSearchBean的方法-》IndexSearcher中的Hits search(Query query):this[/b].queryFilters.filter(query); -》QueryFiltes中的BooleanQuery filter(Query input)
input的值为:[处理, output, -url:www, -publishUrl:qqq]
2[/b]、解决方案[/b]
在Nutch中已经实现了 一个CustomFieldQueryFilter()的插件用于将自定义字段名加到QueryFilter中。
首先修改customs-field.xml文件,如下:[/b]
然后修改plugin/query-custom/plugin.xml
把里面的<parameter name="fields" value="publishUrl,publishTitle" />
把value改成你自己的字段名
最后在nutch-default.xml中把query-custom加到plugin.includes中
错误org.apache.nutch.searcher.QueryException: Not a known field name:publishUrl原因
原因分析:
在NutchBean的main()方法中
final[/b] NutchBean bean = new[/b] NutchBean(conf); |
searchBean = new[/b] LuceneSearchBean(conf, indexDir, indexesDir); |
this[/b].searcher = new[/b] IndexSearcher(indexDir, this[/b].conf); |
this[/b].queryFilters = new[/b] QueryFilters(conf); |
private[/b] QueryFilter[] queryFilters; //加载的filter private[/b] HashSet<String> FIELD_NAMES ; //字段名 private[/b] HashSet<String> RAW_FIELD_NAMES;//字段名 |
UrlQueryFilter、SiteQueryFilter四个插件
FIELD_NAMES中的值为[site, , lang, DEFAULT, url]
RAW_FIELD_NAMES中的值为[site, , lang]
在QueryFilter()的构造函数中会将FIELD_NAMES和RAW_FIELD_NAMES存入到ObjectCahche中
FIELD_NAMES.addAll(fieldNames); FIELD_NAMES.addAll(rawFieldNames); objectCache.setObject("FIELD_NAMES", FIELD_NAMES); RAW_FIELD_NAMES.addAll(rawFieldNames); objectCache.setObject("RAW_FIELD_NAMES", RAW_FIELD_NAMES); |
input的值为:[处理, output, -url:www, -publishUrl:qqq]
public[/b] BooleanQuery filter(Query input) throws[/b] QueryException { // first check that all field names are claimed by some plugin Clause[] clauses = input.getClauses(); for[/b] (int[/b] i = 0; i < clauses.length; i++) { Clause c = clauses[i]; if[/b] (!isField(c.getField())) //因为自定义字段publishUrl不在 FIELD_NAMES中,所以此处报错。 throw[/b] new[/b] QueryException("Not a known field name:"+c.getField()); } // then run each plugin BooleanQuery output = new[/b] BooleanQuery(); for[/b] (int[/b] i = 0; i < this[/b].queryFilters.length; i++) { output = this[/b].queryFilters[i].filter(input, output); } return[/b] output; } |
public[/b] boolean[/b] isField(String name) { return[/b] FIELD_NAMES.contains(name);//判断该字段是否在FIELD—NAMES中 } |
在Nutch中已经实现了 一个CustomFieldQueryFilter()的插件用于将自定义字段名加到QueryFilter中。
首先修改customs-field.xml文件,如下:[/b]
<entry key="publishUrl.name">publishUrl</entry> <entry key="publishUrl.indexed">yes</entry> <entry key="publishUrl.stored">yes</entry> <entry key="publishUrl.tokenized">yes</entry> <entry key="publishUrl.boost">1.0</entry> <entry key="publishUrl.multi">false</entry> <entry key="publishTitle.name">publishTitle</entry> <entry key="publishTitle.indexed">yes</entry> <entry key="publishTitle.stored">yes</entry> <entry key="publishTitle.tokenized">yes</entry> <entry key="publishTitle.boost">1.0</entry> <entry key="publishTitle.multi">false</entry> |
把里面的<parameter name="fields" value="publishUrl,publishTitle" />
把value改成你自己的字段名
最后在nutch-default.xml中把query-custom加到plugin.includes中
相关文章推荐
- Nutch中搜索时把自定义的字段(filed)加入检索条件
- ios 学习之 NSPredicate 模糊、精确、查询 ,包括模糊搜索,多条件搜索,及属性中多个字段检索
- DEDE首页自定义字段、多条件搜索功能
- phpcms后台栏目列表自定义字段搜索功能
- JS视图搜索功能(将检索条件赋到url中传值)
- Lucene根据字段进行自定义搜索扩展
- ThinkPHP搜索条件是数组,加一条自定义Sql条件解决办法
- ThinkPHP搜索条件是数组,加一条自定义Sql条件解决办法
- 检索Table的某一字段是否存在某个条件的数据
- 自定义字段做条件
- Lucene.NET多字段 多条件搜索
- ThinkPHP搜索条件是数组,加一条自定义Sql条件解决办法
- Nutch分布式检索配置过程及端口启动顺序对搜索结果的影响分析
- 利用Nutch实现分类搜索(一)(加入index plugin)
- ThinkPHP搜索条件是数组,加一条自定义Sql条件解决办法
- 利用Nutch实现分类搜索(一)(加入index plugin)
- Solr5.2.1搜索服务部署——检索多字段
- lucene 自定义评分 (给lucene自带的评分*我们filed的系数) 如搜索结果时间的加权
- 让dedecms搜索页面支持标签调用及自定义字段调用的方法
- 常规功能和模块自定义系统 (cfcmms)—051一对多(OneToMany)字段的加入