### Elasticsearch Version

main @ aa862640e5af74815a0d1d9b9ae3734426ffb459

### Installed Plugins

_No response_

### Java Version

openjdk version "17.0.8" 2023-07-18

### OS Version

Ubuntu 23.04

### Problem Description

May be related to https://github.com/elastic/elasticsearch/issues/101017.

`LIKE` seems not to handle backslashes correctly. Given a field containing Windows-style paths, like `C:\a\b\c`, the following query should succeed:
```
from the_index | where the_field like "C:\\*"
```
but if sent via Kibana, returns an empty result.

### Steps to Reproduce

Via cURL:

Start a local instance of Elasticsearch and create an index with a Windows-style path:
```bash
$ curl -v -u elastic:password 'localhost:9200/my-idx/_doc' -H "Content-Type: application/json" -d '{"a": "C:\\b\\c.exe"}'
```

Now, with a single backslash, the query does not parse:
```bash
$ curl -v -u elastic:password 'localhost:9200/_query' -H "Content-Type: application/json" -d '{"query": "from `my-idx` | where a like \"C:\\*\""}'

{"error":{"root_cause":[{"type":"parsing_exception","reason":"line 1:30: token recognition error at: '\"C:\\*'"}],"type":"parsing_exception","reason":"line 1:30: token recognition error at: '\"C:\\*'","caused_by":{"type":"lexer_no_viable_alt_exception","reason":null}},"status":400}
```

With two backslashes, we obtain an empty result:
```
curl -v -u elastic:password 'localhost:9200/_query' -H "Content-Type: application/json" -d '{"query": "from `my-idx` | where a like \"C:\\\\*\""}' 

{"columns":[{"name":"a","type":"text"},{"name":"a.keyword","type":"keyword"}],"values":[]}%
```
In both cases, no warnings emitted (except the standard "No limit defined...")

### Logs (if relevant)

_No response_
x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/util/StringUtils.java
}
    }
    public static BytesRef parseIP(String string) {
        var inetAddress = InetAddresses.forString(string);
        return new BytesRef(InetAddressPoint.encode(inetAddress));
    }
    public static String ordinal(int i) {
        return switch (i % 100) {
            case 11, 12, 13 -> i + "th";
            default -> i + INTEGER_ORDINALS[i % 10];
        };
    }
    public static Tuple<String, String> splitQualifiedIndex(String indexName) {
        int separatorOffset = indexName.indexOf(REMOTE_CLUSTER_INDEX_SEPARATOR);
        return separatorOffset > 0
            ? Tuple.tuple(indexName.substring(0, separatorOffset), indexName.substring(separatorOffset + 1))
            : Tuple.tuple(null, indexName);
    }
    public static String qualifyAndJoinIndices(String cluster, String[] indices) {
        StringJoiner sj = new StringJoiner(",");
        for (String index : indices) {
            sj.add(cluster != null ? buildRemoteIndexName(cluster, index) : index);
        }
        return sj.toString();
    }
    public static boolean isQualified(String indexWildcard) {
        return indexWildcard.indexOf(REMOTE_CLUSTER_INDEX_SEPARATOR) > 0;
    }
}