[lucene] 单个字怎么检索

mniz 2010-03-22
HuangSui.cn 写道
索引是依赖词典建的,添加新词当然要更新索引
但我不认为会需要频繁添加新词,时时性看需求,没有适合任何需求的系统
如果仅仅要将不成词的单字检索出,或者分词后的单字检索出,实现这样的分词器就可以了


问题是
服装能搜索出来,现在搜索服不能搜索出来
然后我就建立必须得给索引库里面添加一个词来分
这样就必须的重新建立索引,
但是还有这样的字啊,你所说的分词器我可能没理解明白 ,麻烦详细点


楼上的说的用ChineseA.分词的话,这样子可以把每个汉字拆成一个字,有成词的吗,还真没用过,覆盖面积达到,总不可能舍弃准确率把
夜是天堂 2010-03-22
一个思路,供参考:
1、得到当前分词器的词典
2、根据得到的词典,维护字到词的索引关系:如根据“少”可以找到“少儿”、“多少”等词。
3、检索时,如果遇到单字,先通过该索引找到所有关联词
4、在Lucene检索这些词

索引关系维护参考代码:
package com.leon.demo;

import java.util.LinkedHashSet;
import java.util.Set;

public class CharacterIndex {
	@SuppressWarnings("unchecked")
	private static final Set<String>[] CHAR_INDEX = new Set[65535];
	
	public static void addWord(String word){
		if (word == null || word.length() == 0){
			return;
		}
		
		char[] chars = word.toCharArray();
		for (char _char:chars){
			if (isCJKCharacter(_char)){
				if (CHAR_INDEX[_char] == null){
					CHAR_INDEX[_char] = new LinkedHashSet<String>();
				}
				CHAR_INDEX[_char].add(word);
			}
		}
	}
	
	public static String[] getWords(char _char){
		if (CHAR_INDEX[_char] == null){
			return new String[0];
		}
		
		return CHAR_INDEX[_char].toArray(new String[0]);
	}
	
	
	/**
	 * 判断是否是CJK字符,from IK CharacterHelper
	 */
	private static boolean isCJKCharacter(char input){
		return Character.UnicodeBlock.of(input) 
					== Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS;
	}
	
	public static void main(String[] args){
		String[] words = new String[]{"多少","少儿","少年","年少无知","多多益善"};
		for (String word:words){
			addWord(word);
		}
		
		words = getWords('少');
		for (String word:words){
			System.out.println(word);
		}
	}
}
mniz 2010-03-22
引用

夜是天堂 


谢谢,这是一个思路,但是我不知道这样的效率会怎么样
毕竟从分词器里面查询出来的,里面有很多个文件的话,IO...操作也多

实在没辙的话,我看看这样的方法

不知道其他人是怎么解决的
mniz 2010-03-22
imjl 写道
mniz 写道
HuangSui.cn 写道
你说要单字检索 又说缺点多
需求不明确
我觉得要先把需求分析清楚


先说一个最明显的缺点

如果建立一个词库的话,添加了一些新的词进去了,之后必须的重建索引,这样才能可以检索出来,是么,这就是最大的麻烦,需要频繁建立索引,而且不是时时的


回复楼上的,几千万的数据,不知道这算不算大,应该是一般的把


大不大自己算下把,

单字大概有多少,很多的话,那么要另想法子了。

少的话,直接扫描,自己做反向索引,考虑下存储,也就是撇开lucene,自己做。
这样做是基于该字已知的前提,我以前记录的供你参考http://imjl.iteye.com/blog/437843  

如果不定的,那就麻烦大了。



嗯,刚看了下,你的方案,这个词本身就是不定的,因为有些我们这里根本想不到用户会输入什么东西,有些区域的叫法也不一样 ,当然输入一个字的情况下毕竟很少,只不过总监他们要求这样干,没办法

目前那些成词的专业术语,还在收集中,单个字的就一个也没有,单个字的也不需要收集,这是考虑怎么检索,想上面有个兄弟说的那样应该是个办法,但是不知道效率会怎么样
mniz 2010-03-22
引用

imjl


在补充一点,单个字那些不成词的不能搜索出来
成词的能搜索出来,比如1、2、3、4这些就完全可以搜索出来,或者女 、男、鞋 、人

特定的字才不行 大伙做过的给个指导下,谢谢

我听一前辈说,计算字和字之间的间距,然后如果给点击率次数高的搜索词。我现在想象也不可行

程序又怎么判断是否成词呢?比如 女、服,女成词,服就不行,程序里面不好判读啊,主要是不定性。
imjl 2010-03-22
字典+正向最大匹配(http://www.5151seo.cn/post/136.html)

扩展现有分词或者修改,当然也可以自己直接写。


如果你想将单字完完整整的匹配到,那么无所谓字典,就是单字做索引了。

祝你好运
HuangSui.cn 2010-03-24
mniz 写道
HuangSui.cn 写道
索引是依赖词典建的,添加新词当然要更新索引
但我不认为会需要频繁添加新词,时时性看需求,没有适合任何需求的系统
如果仅仅要将不成词的单字检索出,或者分词后的单字检索出,实现这样的分词器就可以了


问题是
服装能搜索出来,现在搜索服不能搜索出来
然后我就建立必须得给索引库里面添加一个词来分
这样就必须的重新建立索引,
但是还有这样的字啊,你所说的分词器我可能没理解明白 ,麻烦详细点


楼上的说的用ChineseA.分词的话,这样子可以把每个汉字拆成一个字,有成词的吗,还真没用过,覆盖面积达到,总不可能舍弃准确率把


还是不明白你要怎样的效果
服装能搜出来,你要单字“服”搜出仅“服装”的内容,还是所有“服”的内容?
要搜出所有“服”的内容,就是单字索引,你要求这个“服”必须是一个二字以上词的一部分?那么切分时,将二字以上的词做单字切分,做索引。

只要你更新了索引的依据了,都要更新索引的。

分词器就是分词器嘛,“服装”切分成“服装”还是“服”“装”,就是分词器嘛。
lyndon.lin 2010-03-25
这个问题应该是分词的问题吧。如果你在建立词库时,有拆分到一个字的话,那就没有问题啊。建立用一些有名的字典分词比较好。
zhaobohao 2010-03-27
兄弟,我两分钟前刚解决了这个问题,
答案就是用regexquery
mniz 2010-03-28
zhaobohao 写道
兄弟,我两分钟前刚解决了这个问题,
答案就是用regexquery



大恩要大榭呀 兄弟
Global site tag (gtag.js) - Google Analytics