91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ES query_string match的區別之一

發布時間:2020-04-09 23:09:48 來源:網絡 閱讀:6298 作者:大海之中 欄目:大數據

今天線上發現一個問題,從而引出對query_string 和 match 的區別的思考。

curl -XGET 'http://localhost:9200/*/*/_search?pretty' -d '{
"from" : 0,
"size" : 10,
"fields" : ["title"],
"query": {
"query_string" : {
"query" : "100CrMo7 +圓鋼",
"fields" : ["title"]
}               
}
}' | grep "100CrMo7"

在這個例子中,在title中查找包含100CrMo7,并且包含圓鋼的數據。

curl -XGET 'http://localhost:9200/*/*/_search?pretty' -d '{
  "from" : 0,
  "size" : 10,
  "fields" : ["title"],
  "query": {
"query_string" : {
"query" : "100CrMo7 -圓鋼",
"fields" : ["title"]
}               
  }
}' | grep "100CrMo7"

在這個例子中,在title中查找包含100CrMo7,但是不 包含圓鋼的數據。

注:替換為simple_query_string 結果好像不盡人意。有一兩條數據 沒有被過濾出。

而看下面的例子

curl -XGET 'http://localhost:9200/*/*/_search?pretty' -d '{
   "size" : 10,
   "fields" : ["title"],
      "query" : {
        "bool" : {
          "must" : {
            "match" : {
              "_all" : {
                "query" : "100CrMo7 -圓鋼",
                "type" : "boolean",
                "operator" : "AND",
                "boost" : 1.0
              }
            }
          }
        }
      }
}' | grep "100CrMo7"

無論是100CrMo7 -圓鋼 還是 100CrMo7 +圓鋼 結果沒有發生變化。

看文檔解釋如下:
The match family of queries does not go through a "query parsing" process. It does not support field name prefixes, wildcard characters, or other "advanced" features.

已就是說后者沒有經過查詢分析的這個過程。
所以如果你使用后者時加入了如下代碼:QueryParser.escape(keyword.trim()) 時,如果關鍵字里有“-” 這么一個特殊符號,比如 100CrMo7-3 , 那么你的查詢結果可能就是空。 所以在使用QueryParser.escape(keyword.trim()) 要分情況。

我們看一下它的源代碼:

public static String escape(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);
      // These characters are part of the query syntax and must be escaped
      if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':'
        || c == '^' || c == '[' || c == ']' || c == '\"' || c == '{' || c == '}' || c == '~'
        || c == '*' || c == '?' || c == '|' || c == '&' || c == '/') {
        sb.append('\\');
      }
      sb.append(c);
    }
    return sb.toString();
  }

因為符號- 被轉譯了。

先看QueryStringQueryParser的解析過程。

ES  query_string  match的區別之一

再看MatchQueryParser類
ES  query_string  match的區別之一

后者沒有轉譯特殊字符,就解釋了使用QueryParser.escape(keyword.trim()) 查不到結果。
繼續查看matchQuery.parse
ES  query_string  match的區別之一

它只是調用查詢分析器(mapping里設置的)去解析各個字段。

點擊parseContext.queryParser

ES  query_string  match的區別之一

看到有很多的解析包括 < >等符號。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桂林市| 新龙县| 冷水江市| 美姑县| 射洪县| 宣汉县| 昌宁县| 开化县| 唐海县| 开平市| 垦利县| 体育| 商丘市| 五常市| 江川县| 仙游县| 乐东| 怀仁县| 漯河市| 岳池县| 盈江县| 东乌| 彰化市| 阜阳市| 光泽县| 宁阳县| 罗田县| 尉氏县| 宁波市| 临江市| 吐鲁番市| 博乐市| 牟定县| 徐闻县| 灌南县| 繁峙县| 云浮市| 神池县| 仁化县| 宣武区| 遂溪县|