紧急求助各位oscer

Anterior 发布于 2012/08/25 17:10
阅读 209
收藏 0
   我是一名学生,明天要参加中国软件杯的决赛,我做的项目是聚焦搜索引擎,主要是针对太平洋电脑网上的手机信息进行爬取,然后建立索引。
           索引和查询这这部分我用的Lucene,分词器用的IK,现在遇到的问题是我想加入一些语义的元素到里面,例如:
           同义词方面的扩展:比如用户想找诺基亚手机相关的内容,他在搜索框里输入“诺基亚”,可以找到结果,但是如果输入“nokia”,这样就找不到结果,这样的问题是否能通过同义词扩展得到解决,或者有别的更好的解决方式吗?如果能通过同义词扩展解决,那么我是否可以通过IK2012的字典加入同义词?具体如何实施?
           语义方面:比如用户输入"诺基亚"他可以找到结果,但是输入诺基亚手机却找不到……我不知到为什么会出现这种情况,下面是我对建立索引的Document的代码,如果有什么不妥还希望能够指正:

/**
 * 为了实现全文检索功能,设计Product的Document 用一个静态方法为Product构建Document
 * 
 * @author horizon
 * @version 1.0.1
 * @date 2012-06-01 23:50:00
 */
public class ProductDocument {
private static final String PRODUCT_ID = "productid";// 对应数据库中的id
private static final String INDEX_TIME = "indextime";// 对应数据库中的索引时间
private static final String PRODUCT_URL = "pruducturl";// 对应数据库中的
private static final String CATEGORY = "category";//对应数据库中的类别
private static final String PRODUCT_NAME = "name";//对应数据库中的商品名称
private static final String PROPERTIES = "properties";//对应数据库中的商品属性
private static final String IMAGE_URL = "imageURL";//对应数据库中的图片地址
private static final String PRODUCT_PRICE="price";//对应数据库中的商品价格
/**
 * 为Product 构建Document ,以实现全文检索
 * 
 * @param product
 * @param id
 * @return
 */
public static synchronized Document buildProductDocument(Product product) {
Document doc = new Document();

Field identifier = new Field(PRODUCT_ID, product.getId(), Field.Store.YES,
Field.Index.NOT_ANALYZED);
long mills = System.currentTimeMillis();
Field indexTime = new Field(INDEX_TIME, mills + "", Field.Store.YES,
Field.Index.NOT_ANALYZED);
Field productURL = new Field(PRODUCT_URL, product.getProductURL(),
Field.Store.YES, Field.Index.NOT_ANALYZED);
Field category = new Field(CATEGORY, product.getCategory(),
Field.Store.YES, Field.Index.ANALYZED);
Field name = new Field(PRODUCT_NAME, product.getName(),
Field.Store.YES, Field.Index.ANALYZED);
Field imageURL = new Field(IMAGE_URL, product.getImageURL(),
Field.Store.YES, Field.Index.NOT_ANALYZED);
Field price = new Field(PRODUCT_PRICE, product.getPrice(),
Field.Store.YES, Field.Index.NOT_ANALYZED);
// 对properties进行处理,将Map拼为一个字符串作为product的property
Map<String, String> property = product.getProperties();
Set<String> keySet = property.keySet();
Iterator<String> iterator = keySet.iterator();
String str = "";
while (iterator.hasNext()) {
String pname = iterator.next();
str += pname+":"+property.get(pname) + " ";
}
Field properties = new Field(PROPERTIES, str, Field.Store.YES,
Field.Index.ANALYZED);
// 建一个综合的Field对category,name ,property进行存储
// 并作为用户默认搜索的Field
String text = product.getCategory();
text += " " + product.getName();
text += " "+product.getPrice();
text += " " + str;
Field all = new Field("all", text, Field.Store.YES,
Field.Index.ANALYZED);
// 将所有的Field添加到Document
doc.add(identifier);
doc.add(indexTime);
doc.add(productURL);
doc.add(category);
doc.add(name);
doc.add(properties);
doc.add(imageURL);
doc.add(price);
doc.add(all);
return doc;
}

}
            另外我还希望能让我的应用能识别更多的语义方面的内容,例如:
            用户输入 “价格在1500元到2000元的nokia手机” 我应该如何去处理这样的输入呢?
            问题大概以上这些,希望您能够抽出宝贵的时间帮我排除一下困难,非常感激!
    此致
          敬礼
加载中
0
th小米粥
th小米粥

如果写好了应该算是智能引擎了吧.

代码帖上来注意格式.

0
Anterior
Anterior

引用来自“仰望星空”的答案

如果写好了应该算是智能引擎了吧.

代码帖上来注意格式.

好的我在贴一份,总感觉是Document设计的不合理

/**
 * 为了实现全文检索功能,设计Product的Document 用一个静态方法为Product构建Document
 * 
 * @author  horizon
 * @version 1.0.1
 * @date 2012-06-01 23:50:00
 */
public class ProductDocument {
	private static final String PRODUCT_ID = "productid";// 对应数据库中的id
	private static final String INDEX_TIME = "indextime";// 对应数据库中的索引时间
	private static final String PRODUCT_URL = "pruducturl";// 对应数据库中的
	private static final String CATEGORY = "category";//对应数据库中的类别
	private static final String PRODUCT_NAME = "name";//对应数据库中的商品名称
	private static final String PROPERTIES = "properties";//对应数据库中的商品属性
	private static final String IMAGE_URL = "imageURL";//对应数据库中的图片地址
	private static final String PRODUCT_PRICE="price";//对应数据库中的商品价格
	/**
	 * 为Product 构建Document ,以实现全文检索
	 * 
	 * @param product
	 * @param id
	 * @return 
	 */
	public static synchronized Document buildProductDocument(Product product) {
		Document doc = new Document();

		Field identifier = new Field(PRODUCT_ID, product.getId(), Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		long mills = System.currentTimeMillis();
		Field indexTime = new Field(INDEX_TIME, mills + "", Field.Store.YES,
				Field.Index.NOT_ANALYZED);
		Field productURL = new Field(PRODUCT_URL, product.getProductURL(),
				Field.Store.YES, Field.Index.NOT_ANALYZED);
		Field category = new Field(CATEGORY, product.getCategory(),
				Field.Store.YES, Field.Index.ANALYZED);
		Field name = new Field(PRODUCT_NAME, product.getName(),
				Field.Store.YES, Field.Index.ANALYZED);
		Field imageURL = new Field(IMAGE_URL, product.getImageURL(),
				Field.Store.YES, Field.Index.NOT_ANALYZED);
		Field price = new Field(PRODUCT_PRICE, product.getPrice(),
				Field.Store.YES, Field.Index.NOT_ANALYZED);
		// 对properties进行处理,将Map拼为一个字符串作为product的property
		Map<String, String> property = product.getProperties();
		Set<String> keySet = property.keySet();
		Iterator<String> iterator = keySet.iterator();
		String str = "";
		while (iterator.hasNext()) {
			String pname = iterator.next();
			str += pname+":"+property.get(pname) + " ";
		}
		Field properties = new Field(PROPERTIES, str, Field.Store.YES,
				Field.Index.ANALYZED);
		// 建一个综合的Field对category,name ,property进行存储
		// 并作为用户默认搜索的Field
		String text = product.getCategory();
		text += " " + product.getName();
		text += " "+product.getPrice();
		text += " " + str;
		Field all = new Field("all", text, Field.Store.YES,
				Field.Index.ANALYZED);
		// 将所有的Field添加到Document
		doc.add(identifier);
		doc.add(indexTime);
		doc.add(productURL);
		doc.add(category);
		doc.add(name);
		doc.add(properties);
		doc.add(imageURL);
		doc.add(price);
		doc.add(all);
		return doc;
	}

}

0
曾杰
曾杰
有一个方法,可以在IK的上面包装一层,然后将一些特殊的词作映射,比如可以先将一些特殊映射配置在一个properties文件里面,在实例化分词器的时候将这些配置加载到一个Map里面, 在TokenStream的incrementToken的时候可以判断这个Map里面是否包含了这些词,然后返回出去
返回顶部
顶部