elasticsearch 如何通过多个关键字过滤搜索查询

czfnxgou  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(159)

test索引中的当前Map。

{
  "mappings": {
    "properties": {
      "tag_ids": {
        "type":"keyword"
      },
      "text": {
        "type":"text"
      }
    }
  }
}

示例文档

#1
{
  "tag_ids":["1","3"],
  "text": "example test"
},
#2
{
  "tag_ids":["1","2"],
  "text": "example test"
},
#3
{
  "tag_ids":["2","3"],
  "text": "example test"
},

现在如何搜索文档并通过tag_ids过滤结果?
如果文档匹配更多的tag_id,则得分应该更高。
“match”、“term”、“terms”用哪个?

{
  "query": {
    "terms":{
      "tag_ids":["1", "2"]
    }
  }
}

我试过术语,但所有文档都有相同的分数1。
我可以把tag_ids作为文本字段,和不同的tag_ids作为术语。

lfapxunr

lfapxunr1#

如果使用bool/should子句并为每个标记id添加一个术语(或匹配)查询,则会得到得分最高的文档#2(因为它包含两个标记id),然后得到得分较低(但相同)的文档#1和#3(因为它们都包含一个标记id

POST tags/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "tag_ids": "1"
          }
        },
        {
          "term": {
            "tag_ids": "2"
          }
        }
      ]
    }
  }
}

响应=>

{
  "hits" : {
    "hits" : [
      {
        "_id" : "2",
        "_score" : 1.1817236,
        "_source" : {
          "tag_ids" : [
            "1",
            "2"
          ],
          "text" : "example test"
        }
      },
      {
        "_id" : "1",
        "_score" : 0.5908618,
        "_source" : {
          "tag_ids" : [
            "1",
            "3"
          ],
          "text" : "example test"
        }
      },
      {
        "_id" : "3",
        "_score" : 0.5908618,
        "_source" : {
          "tag_ids" : [
            "2",
            "3"
          ],
          "text" : "example test"
        }
      }
    ]
  }
}

相关问题