通过弹性搜索在特定区域中搜索单词

时间:2015-10-08 21:21:04

标签: ruby-on-rails elasticsearch

我有一个要求,我必须通过弹性搜索在内容中的特定位置搜索单词。例如,我有三条记录:

{
 "user": "apple",
 "postDate": "2011-12-13",
 "body": "ID: Hello\n Reference: Link to SH13",
 "title": "Documents"
} 
{
 "user": "apple",
 "postDate": "2011-11-14",
 "body": "ID: SH13\n Reference: Nothing SH186",
 "title": "Documents"
} 
{
 "user": "apple",
 "postDate": "2012-10-13",
 "body": "ID: Sample\n Reference: Nothing SH13",
 "title": "Documents"
} 

如果我尝试以下查询,我会得到以上所有记录......

http://localhost:9200/blog/post/_search?q=body:SH13&pretty=true

但我想搜索哪个只是参考,而没有在数据库中有一个单独的Reference列。当我搜索' SH13'(参见参考文献)

时,我希望输出只有下面的一个

{
 "user": "apple",
 "postDate": "2011-12-13",
 "body": "ID: Hello\n Reference: Link to SH13",
 "title": "Documents"
}
{
 "user": "apple",
 "postDate": "2012-10-13",
 "body": "ID: Sample\n Reference: Nothing SH13",
 "title": "Documents"
}

我希望你理解这个问题......谢谢

1 个答案:

答案 0 :(得分:0)

您需要对您尝试搜索的内容进行完全匹配。在您的情况下,以下查询将只获得第二条记录:

http://localhost:9200/blog/post/_search?q=body:"Reference: SH13"

<强>更新

如果您知道引用始终是body字段的最后一个标记,并且您只想搜索该标记,则可以按以下步骤操作:

首先,将您的body字段设为包含not_analyzed子字段的多字段:

curl -XPUT localhost:9200/blog/_mapping/post -d '{
  "post": {
    "properties": {
      "body": {
        "type": "string",
        "fields": {
          "raw": {         <--- we're adding this not_analyzed sub-field to the body field
            "type": "string",
            "index": "not_analyzed"
          }
        }
      }
    }
  }
}'

然后,您需要重新索引数据,以便填充body.raw子字段。

最后,您将能够搜索仅出现在body字段末尾的引用,如下所示:

curl -XGET localhost:9200/blog/post/_search?q=body.raw:/.*SH13/&analyze_wildcard=true&lowercase_expanded_terms=false

我们正在使用regexp body.raw搜索/.*SH13/字段,该字段指定SH13令牌必须位于字段的末尾。此外,我们告诉ES分析通配符*(默认情况下不是这样),并且不要小写这些术语(默认情况下会这样做)。

执行上述三个步骤只会获得您期望的两个文档。