我有一个要求,我必须通过弹性搜索在内容中的特定位置搜索单词。例如,我有三条记录:
{
"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"
}
我希望你理解这个问题......谢谢
答案 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分析通配符*
(默认情况下不是这样),并且不要小写这些术语(默认情况下会这样做)。
执行上述三个步骤只会获得您期望的两个文档。