Elasticsearchクエリでネガティブルックアヘッドを実行しようとしています。正規表現は次のとおりです。
(?!.*charge)(?!.*encode)(?!.*relate).*night.*
私が照合しているテキストは次のとおりです。
まだ建設に問題がありますが、夜の滞在でクレジットされます。化学薬品が噴霧されることにより健康上の問題を引き起こし、目を刺激します。
運が悪かった。誰かが手を差し伸べることはできますか?
ENクエリ:
"query": {
"filtered": {
"query": {
"bool": {
"must_not": [
{
"regexp": {
"message": {
"value": "(?!.*charge)(?!.*encode)(?!.*relate).*night.*",
"flags_value": 65535
}
}
}
]
}
},
"filter": {
"match": {
"resNb": {
"query": "462031152161",
"type": "boolean"
}
}
}
}
}
次の2つのいずれかで問題を解決できます。
"value": "~(charge|encode|relate)night~(charge|encode|relate)",
または
.*night.*&~(.*(charge|encode|relate).*)
オプション付き(デフォルトでオンになっているため)
"flags" : "ALL"
一般的なNFA正規表現では、通常、より一般的なパターン((?!...)
またはのように見えるもの(?<!...)
)を制限するのに役立つ否定的なルックアラウンドがあります。ただし、ElasticSearchでは、特定のオプションの演算子を使用する必要があります。
~
(チルダ)は補数*右のそれの後に原子を否定するために使用されます。アトムは、単一のシンボル、またはグループ内のサブパターン/代替のグループのいずれかです。
NOTEすべてのESパターンは、デフォルトでは文字列の先頭と最後に固定されていることを、あなたは使用する必要はありません^
し、$
Perlの様および.NETで共通、およびその他のNFA。
したがって、
~(charge|encode|relate)
-以外の文字列の先頭から任意のテキストに一致しcharge
、encode
かつrelate
night
-単語に一致します night
~(charge|encode|relate)
-文字列の最後までの3つの部分文字列のいずれか以外のテキストに一致します。PerlのようなNFA正規表現では、強化された貪欲なトークンを使用してそのパターンを書くことができます。
/^(?:(?!charge|encode|relate).)*night(?:(?!charge|encode|relate).)*$/
2番目のパターンは注意が必要です。通常、一般的なNFA正規表現は、一致するときに場所から場所にジャンプしないため、テキストの先頭に固定された先読みが一般的に使用されます。ここでは、使用してINTERSECTION我々はわずか2つのパターンを使用することができ、1が文字列にマッチされると、二つ目は、文字列と一致している必要があります。
.*night.*
-行全体(として一致.
マッチ任意のシンボルが、改行、他に、使用(.|\n)*
して)night
その中に&
-そして~(.*(charge|encode|relate).*)
- charge
、encode
およびrelate
部分文字列を含まない行。NFAPerlのような正規表現は次のようになります
/^(?!.*(charge|encode|relate)).*night.*$/
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加