Apache solr 搜索部分单词

发布于 2024-08-16 10:19:20 字数 296 浏览 7 评论 0 原文

我正在使用 apache solr 搜索引擎来索引我的网站数据库。

我正在使用 django+http://haystacksearch.org/< /a>

所以,假设我有一个包含单词“Chicken”的文档,

当我搜索“chicken”时 - solr 可以找到此文档

,但是当我搜索“chick”时 - 它找不到任何内容。

有没有办法解决这个问题?

I'm using apache solr search engine for indexing my website database..

I'm using django+http://haystacksearch.org/

So let's say I have document that have word "Chicken"

When I search for "chicken" - solr can find this document

But When I search "chick" - it does not find anything..

Is there a way to fix this ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

胡大本事 2024-08-23 10:19:20

注意:以下解决方案是 Solr 1.4(及更高版本) 特定的!

为了获得更大的灵活性,我建议使用 NGramTokenizerFactory 进行完整的前后通配符搜索。如果您只想搜索字符串开头或结尾的子字符串,请考虑使用 EdgeNGramTokenizerFactory

这是文本字段类型的替换,可以满足您的需求:

<fieldType name="text" class="solr.TextField" >
<analyzer type="index">
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
    <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

Note: The following solution is Solr 1.4 (and above) specific!

For more flexibility, I would recommend indexing your data with the NGramTokenizerFactory to do complete front and back wildcard searches. If you just want to search for substrings at the beginning or end of the string, consider using the EdgeNGramTokenizerFactory.

Here's a drop in replacement of the text field type which would accomodate your need:

<fieldType name="text" class="solr.TextField" >
<analyzer type="index">
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
    <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
始于初秋 2024-08-23 10:19:20

如果您想查找所有以chick开头的单词,请搜索chick*。

If you want to find all words that start with chick, search for chick*.

眼前雾蒙蒙 2024-08-23 10:19:20

当我使用

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />

Brian 的答案进行通配符搜索时,Solr 索引时间急剧增加。都在20多次!
我在这里找到的通配符搜索问题的另一个决定:

http://www.lucidimagination.com/blog/2009/09/08/auto-suggest-from-popular-queries-using-edgengrams/

您只需添加过滤器

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />

(默认分词器 - FieldType 索引块中的 solr.WhitespaceTokenizerFactory)。对我来说,结果是相同的,但系统成本更低。

When I've used

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />

for making wildcard search from Brian's answer, Solr indexing time dramaticly increased. In more than 20 times!
The other decision of wildcard searching problem I found here:

http://www.lucidimagination.com/blog/2009/09/08/auto-suggest-from-popular-queries-using-edgengrams/

You need just add filter

<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />

(default tokenizer - solr.WhitespaceTokenizerFactory in index block of FieldType). For me result was the same with less system costs.

风苍溪 2024-08-23 10:19:20

如果您在处理一小部分单词时遇到问题,另一种方法是使用 solr.SynonymFilterFactory

http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory

您只需维护一个包含同义词的简单文本文件:

chick peep chicken
dawg hound dog
moggie puss kitten cat

复数应该与其他过滤器一起处理。

A different approach, if you are having trouble with a small set of words, would be to use the solr.SynonymFilterFactory

http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory

You just have to maintain a simple text file that contains synonyms:

chick peep chicken
dawg hound dog
moggie puss kitten cat

Plurals should take care of themselves with other filters.

我的鱼塘能养鲲 2024-08-23 10:19:20

我没有更改任何配置。我只是在搜索字符串的前面和后面使用星号:*chicke *(末尾没有空格 - >这是因为如果您在开头和结尾使用 *,则将单词格式化为斜体)

I haven't changed any configuration. I am just using star in front and in the back of my searchString: *chicke * (without white space at the end -> it's because of SO formatting word as italic if you use * at the beginning and at the end)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文