如何分析没有分隔符的文本(例如域名)?

How do I analyze text that doesn't have a separator (eg a domain name)?

我有一堆没有我想要搜索的顶级域名的域名,但它们并不总是在单词之间有自然的分隔符(如“-”)。例如:

techtarget
americanexpress
theamericanexpress // a non-existent site
thefacebook

最好用的分析仪是什么?例如如果用户输入 "american ex",我希望 "americanexpress" 优先于 "theamericanexpress"。在这种特殊情况下,一个简单的前缀查询就可以工作,但是用户然后输入 "facebook" 但那不会 return 任何东西。 ;(

在包括您在内的大多数情况下,Standard Analyzer 就足够了。此外,它是 ElasticSearch 中的默认分析器,它提供 grammar based tokenization。例如: "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone." 将被标记为 [ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ].

在您的例子中,域名被标记为 [techtarget, americanexpress, theamericanexpress, thefacebook] 的术语列表。

Why query search for facebook doesnot return anything?

因为字典中没有 facebook 个词,因此搜索结果 return 没有数据。发生的事情是 ES 试图在字典中查找搜索词 facebook,但字典只包含 thefacebook,因此搜索 return 没有结果。

解法:

为了将搜索词 facebookthefacebook 匹配,您需要将 通配符包裹在搜索词 中,即 .*facebook 将匹配thefacebook。但是,您应该知道使用 regex 会产生性能开销。

其他解决方法是您可以使用 synonyms。同义词的作用是您可以为搜索词指定同义词(替代搜索词列表)。例如"facebook, thefacebook, facebooksocial, fb, fbook",有了这些同义词,您可以从这些同义词中提供任何搜索词,它将与这些同义词中的任何一个匹配。即,如果您的搜索词是 facebook 并且您的域存储为 thefacebook,则搜索将被匹配。

此外,为了确定优先级,您需要先了解如何 scoring work in ES and then you can use Boosting