有一段文本,有名称mc与内容nr两段。nr好说,分词不储存。
mc格式为“中国>>上海>>普陀”这种形式,为了保证其精确性,在检索时不会被拆分,所以不设置分词,设置Field.Index.UN_TOKENIZED。
那么问题是,在检索名称时,由于mc被认为是一个最小的单位,那么该怎么查询。
这里不知道谁有个好的思路?
其实我想问的问题是如何在搜索引擎中使用精确搜索。lucene中将文本进行分词,再来进行匹配。但是有一些内容(如上面的mc)就要求十分准确,甚至不管其中有没有特殊符号或者用户输入的关键字那不能识别出来等,都需要查询出来。
所以在设置时是将Field.Index为UN_TOKENIZED,那么在存储时就会将这段文本做为一个term,如上文中“中国>>上海>>普陀”,这个时候除了使用"中国>>上海>>普陀"本身,不知道有其它办法进行匹配。如用户在只输出“上海”的情形下,怎么找到这段文本。
[color=red]
大家谁有思路都可以给个参考啊,最后还有4个wave邀请送给大家! :D :D :D [/color]
[b]问题补充:[/b]
你说的有点意思了。但是回到了最开始的问题了。
你推荐了一个前缀匹配查询,当然,我一开始的设想是通配符查询。
但是存在同样的一个问题就是,如果存在以下两个词条
中国>>上海>>普陀
中国>>上海上>>普陀
那么,当用户输入“上海”时,希望能够匹配“中国>>上海>>普陀”
而不是那个“中国>>上海上>>普陀”的地方
[b]问题补充:[/b]
关于分词,你可能误解我的意思,我当然不担心保存在索引中的数据会发生变化,担心的是,分词可能会导致查询的准确性不能达到100%,对于有些文本不会追求准确性的,但总有些要求很精准的。尤其是一些目录结构的,用户可能就是挑中能记忆的名称输入,但是系统总得查询出来与之相关的所有内容。
当然,如你所说,分词的效果取决于分析器的效果。我知道分词口号就是10%的设置能应用于90%的情况。这里的要求是不是有点太苛求了。
至于你所说的HitCollector,还没有看过,我先看看,再试下。
[b]问题补充:[/b]
哦,谢谢了,我先试试。
我要遵守承诺,发一个wave,你把你的邮箱留下吧。
帖子不关,等看看还有没有人来指导下。集思广益,看看有没有其它思路。
如果还有什么问题,我可能会直接发站内信麻烦你了。
[b]问题补充:[/b]
[quote]地区间用空格,然后用SimpleAnalyzer去解析, [/quote]
本来想用你的思路来试下,没想到遇到的第一个问题就是:
我现在的是
[code="java"]Analyzer analyzer = new PaodingAnalyzer();
IndexWriter indexWriter = new IndexWriter(indexFile, analyzer, true);[/code]
怎么能同时用SimpleAnalyzer呢
[b]问题补充:[/b]
SimpleAnalyzer的效果肯定是要不得的,因为在全文分词是会依据空格分成一句一句的。
而且在分词后,还是会出现匹配上问题
[b]问题补充:[/b]
嗯,经过测试,我确定HitCollector可以满足需求。
其实在昨天,我有了一个更简单的方案。因为数据全部存储在oracle中,因此可以使用oracle Text。
当然,oracle的分词效果好像并不好,不过对现有代码改动之类都比较小,并且也能够满足需求。
要谢谢两位的帮忙。
luckaway请留下您的邮箱。
[b]问题补充:[/b]
[quote]硬编码在Analyzer里 [/quote]
这样到是可以将中国>>上海>>普陀分得更加的准确。
其实,可能我没有说清。关键关不是在分词的准确上,而是要求查询匹配得准确要求非常高。你不可能指望那些可能念都不念不通的话会分成一个term的。
layer555说的HitCollector,就是实现这个目的,因为我希望那部分内容是进行不分词索引的,并且还要求用一种特别的规律进行查询出来。
[b]问题补充:[/b]
嗯,好的。
如果搜索上有问题,还会向你请教的。