Elasticsearch在更大的文本中搜索关键字

时间:2013-11-22 09:16:36

标签: elasticsearch

我是Elasticsearch的新手。 我在Elasticsearch中存储了很多关键字,比如

{"text": "harry potter", "added": "2013-11-10"}
{"text": "prisoner of azkaban", "added": "2013-11-10"}
...

我想要做的是,给定更大的文本,找到该字符串中出现的所有关键字。

例如,对于字符串harry potter and the prisoner of azkaban,我很可能希望harry potterprisoner of azkaban留下and the作为余数。

我的算法是

1. search the keyword with the best score for the input
2. if found, remove the keyword inside the input. otherwise exit.
3. go back to step 1 and use the remainder as the input.

我最初使用此查询

{
   "query": {
       "match": {
           "text": "harry potter and prisoner of azkaban"
       }
   }
}

这很可能在第一次传递中返回prisoner of azkaban,之后返回harry potter

对于我拥有的大多数文本输入,这很有效。但后来我注意到一些文字输入,由于得分,我得不到我的期望。有些关键字的得分比另一个好,但在输入中并不存在。

例如,在一种情况下,有一个关键字prisoner harry potter。当我使用harry potter and prisoner of azkaban尝试查询时,此关键字(仅为示例)假设的最佳得分低于harry potterprisoner of azkaban,但我无法删除内部的关键字由于订单的输入。

好吧,我可以将算法修改为

1. search the 5 keywords with the best score for the input
2. for each keywords check against the input, 
      if a keyword inside the input remove it from the input.
3. if at least one keyword is inside the input go back to step 1
      and use the remainder as the new input otherwise exit.

但我想知道是否有其他方法可以修改,可能是查询,或者可能是分析器,或者可能是用于改进评分的映射。

..或者Elasticsearch可能不适合这个?

1 个答案:

答案 0 :(得分:2)

您可以使用shingle indexing,然后使用一个查询进行一次搜索,而无需使用任何算法。

Shingle分析器基本上将您的文本分成术语和术语组。

Text : I love apple
Terms: I, love, apple, I love, love apple, I love apple

使用以下查询来匹配所有文档。

{
   "query": {
       "match": {
           "text": "harry potter and prisoner of azkaban"
       }
   }
}

Also here an answer to my question about shingle analyzer.