2016-12-06 38 views
1

我的弹性服务器中有文本索引。 我已经实现了NGRAM分词是这样的:在文本中使用ngram搜索搜索模式的最小字符和以上

"analysis": { 
     "analyzer": { 
     "ngram_analyzer": { 
      "type": "custom", 
      "tokenizer": "ngram_tokenizer" 
     } 
     }, 
     "tokenizer": { 
     "ngram_tokenizer": { 
      "type": "ngram", 
      "min_gram": "3", 
      "max_gram": "7" 
     } 
     } 
    }, 

比方说我的数据是

“你好美丽的世界ELL”

当我把查询匹配“地狱” 我希望它只发现我的第一个字(你好),而不是字ell,所以basickly我不希望它“打破”我的搜索模式只是为了在我的数据中找到它(与4个字符,而不是下面)

谢谢

+0

你好将被标记为 - >“Hel,ell,llo,hell,ello,hello”和ell as - >“ell”,当你搜索它时,你仍然只有一个结果,那就是你的整个字符串 - >“你好美丽的世界埃尔”。 可以说,你有列表句子,一个是“你好美丽的世界”,另一个是“美丽的世界”,你搜索“埃尔”你会得到它们,因为这是你的标记器如何索引它们。 – mirzak

+0

我同意你的意见,但我正在寻找地狱,而且我希望得到地狱和你好,而不是呃(因为我没有搜索它 - 它有更少的字母和缺少H)这个词 –

+0

我不明白的是为什么搜索者正在打破我的言论进入Hel,Ell,地狱,不仅寻找地狱 –

回答

1

解决方法是更改​​分析器中的标记器。

例如,你可以不喜欢它

"some_analyzer": { 
    "type": "custom", 
    "tokenizer": "whitespace", 
    "filter": [ "lowercase" ] 
    } 

重要的是你的搜索分析仪没有NGRAM分词器。

+0

谢谢,但我认为空格标记器不允许我搜索部分短语,如果我有文本“Hello beautiful world ell”,并搜索“地狱”它不会像我期待的那样在第一个单词中找到它,不是吗? –

+0

我刚刚试过这样。我索引了一个“你好美丽的世界”,并搜索了“地狱” - >它在“你好”中有一个命中。这是因为我使用nGram标记器(3 - 30)。你好会被标记为:“Hel,Ell,llo,Hell,ello,Hello”,而“ell”只是“ell”。搜索分析器标记器是“空白”,这意味着它将分割搜索字符串的空白。就我而言,它不会因为它的“地狱”而分裂。它能够找到它,因为我有“地狱”索引作为条款之一。更多条款:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html – mirzak

+0

非常感谢你,那正是我所做的,它解决了这个问题!谢谢。 新问题现在,我使用亮点,并且由于我正在寻找地狱这个事实,它不会因某种原因而夜间照亮你的话...... –