弹性搜索:过滤/匹配多个短语



这是我正在搜索的JSON....

{ courseintakes: "Trimester 1; Trimester 2; Trimester 3" }
{ courseintakes: "Trimester 1; Trimester 2" }
{ courseintakes: "Trimester 2; Trimester 3" }
{ courseintakes: "Trimester 1"}
{ courseintakes: "Trimester 3"}

我还设置了一个自定义分析器并应用于此字段,该字段在分号(;)

...
"analysis": {
         "analyzer": {
            "semi_colon_analyzer": {
               "type": "pattern",
               "pattern": ";"
            }
         }
      }

现在,有效搜索此字段的最佳方法是什么...

我试过这个(没有返回结果(

"must": [
        {
          "terms": {
            "courseintakes": [
              "Trimester 2",
              "Trimester 3"
            ]
          }
        }

然后,我尝试了这个(没有返回结果(

"match": {
            "courseintakes": "Trimester 2,Trimester 3"
          }

我做错了什么?我应该如何有效地搜索这个?

示例场景:我所期望的是,当我搜索三个月 1 和三个月 2 时,它应该返回列出这些三个月中的任何一个的所有行/记录。

这是映射

{
  "mappings": {
    "courses": {
      "properties": {
        "courseintakes": {
          "type": "text"
        },
        "course_id": {
          "type": "integer"
        }
      }
    }
  }
}

如果有什么不清楚的地方,请随时询问。

任何帮助都非常感谢。谢谢

您必须更改自定义分析器。您可以使用分析 API 查看如何根据当前分析器分析文本

   POST custom/_analyze?analyzer=semi_colon_analyzer
   {
    "text" :  "Trimester 1; Trimester 3"
   }

您将获得以下输出:

 {
  "tokens": [
   {
     "token": " trimester 1",       <==== Please note a space in beginning
     "start_offset": 0,
     "end_offset": 11,
     "type": "word",
     "position": 0
   },
   {
     "token": " trimester 3",           <==== Please note a space in beginning
     "start_offset": 13,
     "end_offset": 24,
     "type": "word",
     "position": 1
    }
  ]
 }

将分析仪更改为 :

 "analyzer": {
        "semi_colon_analyzer": {
           "type": "pattern",
           "pattern": "; ",     <== Space after semi colon
           "lowercase" : false
        }
     }

您的文本将以以下形式标记:

  {
    "tokens": [
     {
      "token": "Trimester 1",       <==== No space in beginning
      "start_offset": 0,
      "end_offset": 11,
      "type": "word",
      "position": 0
    },
    {
      "token": " trimester 3",           <==== No space in beginning
      "start_offset": 13,
      "end_offset": 24,
      "type": "word",
      "position": 1
     }
   ]
  }

然后应用terms查询,它将起作用

    {
      "terms": {
        "courseintakes": [
          "Trimester 2",
          "Trimester 3"
        ]
      }
    }

希望有帮助!!

最新更新