Elasticsearch对术语不敏感的搜索

时间:2015-12-10 11:44:42

标签: elasticsearch

我有下一个搜索查询

    {  
       "query":{  
          "bool":{  
             "must":[  
                {  
                   "term":{  
                      "cardrecord.fields.name.raw":"HERE_IS_SOME_NAME"
                   }
                }
             ],
             "must_not":[  

             ],
             "should":[  

             ]
          }
       },
       "from":0,
       "size":50,
       "sort":[  

       ],
       "facets":{  

       }
    }

如何按术语修改案例insensetive搜索的查询?如果需要,我可以添加更多描述。

4 个答案:

答案 0 :(得分:1)

使用过滤器代替查询,这将减少大量处理:

{  
   "filter":{  
      "bool":{  
         "must":[  
            {  
               "term":{  
                  "cardrecord.fields.name.raw":"HERE_IS_SOME_NAME"
               }
            }
         ],
         "must_not":[  

         ],
         "should":[  

         ]
      }
   },
   "from":0,
   "size":50,
   "sort":[  

   ],
   "facets":{  

   }
}

答案 1 :(得分:1)

尝试使用匹配查询

{  
       "query":{  
          "bool":{  
             "must":[  
                {  
                   "match":{  
                      "cardrecord.fields.name.raw":"HERE_IS_SOME_NAME"
                   }
                }
             ],
             "must_not":[  

             ],
             "should":[  

             ]
          }
       },
       "from":0,
       "size":50,
       "sort":[  

       ],
       "facets":{  

       }
    }

答案 2 :(得分:1)

您可以使用match查询,但需要匹配cardrecord.fields.name字段,因为raw子字段可能是not_analyzed,因此无法使用用于不区分大小写的匹配。

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "cardrecord.fields.name": "HERE_IS_SOME_NAME"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 50,
  "sort": [],
  "facets": {}
}

答案 3 :(得分:1)

默认情况下,使用Standard Analyzer分析所有字段。如果在"index":"not_analyzed"中指定mapping,则不会分析该字段

Standard Analyzer将输入字符串转换为小写,并使用空格和特殊字符进行拆分。因此,在您的情况下,HERE_IS_SOME_NAME将被分为令牌somename。但令牌hereis不会被创建,因为它们是英语副词。

搜索"cardrecord.fields.name.raw"字段时会发生同样的事情。它会拆分为令牌,并在特定字段中使用该令牌搜索所有文档(使用Standard Analyzer)。 P.S:可以配置单独或不同的analyzer进行搜索。

所以匹配查询会搜索包含somename令牌的所有文档。因此,您将获得其他文件。

term query专门查找确切大小写和完整单词匹配。但它不会匹配任何文档,因为令牌已经splitlowercase

根据您的要求执行以下步骤:

{
  "mappings": {
    "my_type": {
      "properties": {
        "cardrecord.fields.name.raw": {
          "type":  "string",
          "index": "not_analyzed" 
        }
      }
    }
  }
}

根据上面给出的代码,为mapping名为index的{​​{1}}更新此my_type。您需要使用新映射创建新索引。由于更新可能无法反映。 然后尝试在您的问题中运行搜索查询。

添加详细的查询序列:

映射:

  {
      "mappings": {
        "my_type": {
          "properties": {
            "cardrecord.fields.name.raw": {
              "type": "string",
              "index": "not_analyzed",
              "store": "true"
            }
          }
        }
      }
    }

索引文档:

{
  "cardrecord.fields.name.raw": "HERE_IS_SOME_NAME"
}

搜索查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "cardrecord.fields.name.raw": "HERE_IS_SOME_NAME"
          }
        }
      ],
      "must_not": [],
      "should": []
    }
  },
  "from": 0,
  "size": 50,
  "sort": [],
  "facets": {}
}