[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 大恩要大榭呀 兄弟 |