ESquery_stringとmatchの違い

今日オンラインで問題を見つけました。それはquery_stringとmatchの違いについて考えることにつながります。

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

この例では、タイトルに100CrMo7と丸鋼を含むデータを検索します。

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

この例では、100CrMo7を含む、タイトルに 丸鋼含まないデータを検索します。

注:simple_query_string置き換えた結果は、 不十分なようです。1つまたは2つのデータは除外されませんでした。

そして、次の例を見てください

curl -XGET 'http://localhost:9200/*/offer/_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 +ラウンドスチール、 結果は変わっていません。

次のように説明するドキュメントを参照してください。

クエリの一致ファミリは、「クエリ解析」プロセスを通過しません。フィールド名のプレフィックス、ワイルドカード文字、またはその他の「高度な」機能はサポートされていません。

言い換えると、後者(一致)はクエリ分析のプロセスを経ていません。
後者を使用するときに、次のコードを追加した場合ので: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();
  }

記号- が翻訳されているため です。

おすすめ

転載: blog.csdn.net/JineD/article/details/112853035