web-dev-qa-db-ja.com

ElasticSearch-ハイフンを使用した検索

Elastic Search 1.6

ハイフンを含むテキスト(U-12、U-17、WU-12、Tシャツなど)にインデックスを付け、「SimpleQueryString」クエリを使用してそれらを検索できるようにしたい。

データサンプル(簡略化):

{"title":"U-12 Soccer",
 "comment": "the t-shirts are dirty"}

ハイフンについてはすでにかなり多くの質問があるので、私はすでに次の解決策を試しました。

Charフィルターを使用します: ElasticSearch-名前にハイフンを使用して検索

だから私はこのマッピングに行きました:

{
  "settings":{
    "analysis":{
      "char_filter":{
        "myHyphenRemoval":{
          "type":"mapping",
          "mappings":[
            "-=>"
          ]
        }
      },
      "analyzer":{
        "default":{
          "type":"custom",
          "char_filter":  [ "myHyphenRemoval" ],
          "tokenizer":"standard",
          "filter":[
            "standard",
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings":{
    "test":{
      "properties":{
        "title":{
          "type":"string"
        },
        "comment":{
          "type":"string"
        }
      }
    }
  }
}

検索は次のクエリで実行されます。

{"_source":true,
  "query":{
    "simple_query_string":{
      "query":"<Text>",
      "default_operator":"AND"
    }
  }
}
  1. 何が機能するか:

    「U-12」、「U *」、「t *」、「ts *」

  2. うまくいかなかったもの:

    「U-*」、「u-1 *」、「t- *」、「t-sh *」、.。

それで、charフィルターは検索文字列で実行されていないようですか?これを機能させるために何ができますか?

答えは本当に簡単です:

Igor Motovからの引用: 標準トークナイザーの構成

デフォルトでは、simple_query_stringクエリはワイルドカードを含む単語を分析しません。その結果、i-maで始まるすべてのトークンを検索します。 Word i-macは、分析中に2つのトークンiとmacに分割され、これらのトークンはどちらもi-maで始まらないため、この要求と一致しません。このクエリでi-macを検索するには、ワイルドカードを分析する必要があります。

{
  "_source":true,
  "query":{
    "simple_query_string":{
      "query":"u-1*",
      "analyze_wildcard":true,
      "default_operator":"AND"
    }
  }
}
7
rvheddeg

この問題の簡単な回避策をまだ探している人がいる場合は、データのインデックスを作成するときにハイフンをアンダースコア_に置き換えてください。

たとえば、O-000022334はO_000022334としてインデックス付けする必要があります。

検索するときは、結果を表示するときにアンダースコアをハイフンに戻します。このようにして「O-000022334」を検索すると、正しい一致が見つかります。

1
Jesal

igor Motovからの引用は真です。正規表現で機能させるには、「analyze_wildcard」:trueを追加する必要があります。ただし、ハイフンは実際には「u」「12」の「u-12」を2つの別々の単語でトークン化することに注意することが重要です。

オリジナルを保持することが重要な場合は、マッピング文字フィルターを使用しないでください。それ以外の場合は、一種の便利です。

「m0-77」、「m1-77」、「m2-77」があると想像してください。m* -77を検索すると、ヒット数はゼロになります。ただし、「-」(ハイフン)をANDに置き換えて、2つの分離された単語を接続し、m * AND77を検索して正しいヒットを得ることができます。

クライアントフロントでそれを行うことができます。

あなたの問題ではu- *

{
  "query":{
    "simple_query_string":{
      "query":"u AND 1*",
      "analyze_wildcard":true
    }
  }
}

t-sh *

  {
      "query":{
        "simple_query_string":{
          "query":"t AND sh*",
          "analyze_wildcard":true
        }
      }
    }
1
londox