簡體   English   中英

Elasticsearch術語不敏感搜索

[英]Elasticsearch insensitive search by term

我有下一個查詢查詢

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

             ],
             "should":[  

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

       ],
       "facets":{  

       }
    }

如何按字詞修改區分大小寫的查詢? 如果需要,我可以添加更多描述。

使用過濾器而不是查詢,這將大大減少處理量:

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

         ],
         "should":[  

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

   ],
   "facets":{  

   }
}

嘗試使用匹配查詢

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

             ],
             "should":[  

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

       ],
       "facets":{  

       }
    }

您可以使用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": {}
}

默認情況下,所有字段均使用Standard Analyzer進行Standard Analyzer 如果在mapping指定了"index":"not_analyzed" ,則不會分析該字段

Standard Analyzer將輸入字符串轉換為小寫並使用空格和特殊字符進行拆分。 因此,在您的情況下, HERE_IS_SOME_NAME將被拆分為some name令牌。 但是hereis的標記不會被創建,因為它們是英語副詞。

當搜索"cardrecord.fields.name.raw"字段時, "cardrecord.fields.name.raw"發生同樣的事情。 它拆分為標記,並在特定字段中搜索所有帶有該標記的文檔(使用Standard Analyzer )。 PS:可以配置單獨或不同的analyzer進行搜索。

因此,匹配查詢會搜索帶有somename標記的所有文檔。 因此,您將獲得其他文件。

term query專門查找確切的大小寫和全字匹配。 但這不會與任何文檔匹配,因為令牌已被splitlowercase

請按照您的要求執行以下步驟:

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

按照上面給出的代碼,為名為my_typeindex更新此mapping 但是,您需要使用新的映射創建新的索引。 由於更新可能無法反映。 然后嘗試在您的問題中運行搜索查詢。

添加詳細的查詢順序:

制圖:

  {
      "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": {}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM