Elasticsearch:过滤/匹配多个短语

时间:2017-05-24 05:01:21

标签: elasticsearch

这是我正在搜索的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"
          }

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

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

这是映射

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

如果有任何不明确的地方,请随时提出。

非常感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:0)

您必须更改自定义分析器。您可以使用Analyze 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"
        ]
      }
    }
希望它有所帮助!!