2011-03-26 90 views
2

我正在寻找一个表或启发式库,可以将像上面的帽子一样的扩展字符转换为常规ascii o。扩展字符(欧洲)以美国ascii为搜索索引

我正在寻找这样做的搜索索引的目的,因为大多数人不打算与帽子o。

例如,我在搜索中输入了“Cote”,但是我希望我的搜索包含诸如“Côte”之类的内容。

它似乎Solr不会转换这些。 我尝试过java.text.Normalizer和 朋友,但没有奏效。 确实有效,请参阅下面的解决方案。

+0

看起来我可能能够将代码点中的第一个字符作为启发式:http://unicode.org/reports/tr15/ – 2011-03-26 15:39:06

+0

该死的看起来我只是要做一个巨大的映射表。 – 2011-03-26 16:04:48

回答

3

想要在Solr中执行索引和查询分析时使用ASCIIFoldingFilterFactory。如果你想要这个独立的,你可以抓住源代码并做任何事情。

+0

我不知道我错过了那个过滤器。我将不得不用这个替换我的黑客。 – 2011-03-31 15:36:22

0

我做了一些快速的谷歌搜索,并没有拿出任何可用的字库进行字符翻译。我可能会错过一些东西。

我发现他们所有的工厂类Solr的javadoc的:
http://lucene.apache.org/solr/api/org/apache/solr/analysis/package-summary.html

我相信你已经看到了已经上,但也许有那么点意思,你可以使用。

我个人的建议是,你将不得不编写你的过滤器。我不相信这很容易。如果你只接受unicode,事情会更简单,但如果你使用的是webapp,那么你将不得不关注从用户浏览器进入的字符集,然后将该字符集转换为unicode。

祝你好运。

+0

我做了,但它看起来像是有希望的:http:// stackoverflow。com/questions/450026/how-can-i-change-extended-latin-characters-to-their-unaccented-ascii- – 2011-03-26 15:56:25

0

这确实出现了工作:

import java.text.Normalizer; 

Normalizer.normalize("ô", Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]",""); 
0

你有正确的总体思路,但错误的具体做法。

请注意,在许多欧洲语言中,删除重音是一个非常糟糕的主意。人们输入它们是有原因的。非常不同的单词只有重音才有区别。 '爸爸'和'papá'不一样。差远了。这些语言的用户期望输入它们并期望获得尊重差异的搜索命中。

其次,这方面现有很多工作。请参阅lucene.apache.org,其中有一组令牌过滤器,用于执行您可能需要或可能不需要的各种操作。

还有其他潜在有用的行为的商业产品,如映射'跑步'到'跑步'等等。

如果您确定要这样做,请首先标准化为'decomposed'(NFKD),然后删除重音符号。强奸(A)。

+0

虽然我一般同意你的观点,在大多数情况下,我应该更好地代表这种情况我主要处理美国人搜索产品(请参阅我的网站http://evocatus.com/)我正在索引这两种拼写组合。大多数电子商务网站(如亚马逊)甚至删除了产品演示文稿中的字符。我至少保留了真正的拼写,同时扩大了搜索范围,但不幸的是提供了更多的误报。 – 2011-03-26 16:54:16

+1

@Ada请参阅编辑处方。 – bmargulies 2011-03-26 17:08:12