我有一个保存文章的索引。文章索引有摘要和内容字段。我为摘要和内容映射设置了
text
类型。
我想搜索摘要或内容字段中同一个句子中出现的两个单词。而且我还必须检查他们之间的脏话。
GET articles/_mapping
输出:
{
"articles": {
"mappings": {
"properties": {
"abstract": {
"type": "text",
},
"content {
"type": "text",
}
}
}
}
}
我知道我可以使用
span_near
在每个字段中进行搜索,但是我如何使用span_near
来搜索同一个句子中出现的两个单词?
这是使用
span_near
的语法
GET /articles/_search
{
"query": {
"bool": {
"should": [
{
"span_near": {
"clauses": [
{
"span_term": {
"abstract": "word1"
}
},
{
"span_term": {
"abstract": "word2"
}
}
],
"slop": 0,
"in_order": true
}
},
{
"span_near": {
"clauses": [
{
"span_term": {
"content": "word1"
}
},
{
"span_term": {
"content": "word2"
}
}
],
"slop": 0,
"in_order": true
}
}
]
}
}
}
注意:根据需要调整斜率值
slop
:这定义了匹配术语之间允许的插入不匹配位置(单词)的最大数量。 slop
或 0
表示单词必须直接相邻出现。
in_order
- 当设置为 true
时,要求单词按指定顺序出现(即 word1
必须出现在 word2
之前)。如果您不关心顺序,请将其设置为false
。
参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-span-near-query.html