0

部分検索 (半オクテクト) を実行しているときに、MAC アドレス検索で適切な結果が返されません。つまり、正確な MAC アドレスを検索すると結果が得られますが、「00:19:9」のような部分検索を検索しようとすると、オクテットを完了するまで何も得られません。

インデックスにどのマッピングを使用する必要があるか、または使用する必要がある検索クエリの種類を誰かが指摘できますか??

curl -XDELETE http://localhost:9200/ap-test
curl -XPUT http://localhost:9200/ap-test

curl -XPUT http://localhost:9200/ap-test/devices/1 -d '
{
  "user" : "James Earl",
  "macaddr" : "00:19:92:00:71:80"
}'

curl -XPUT http://localhost:9200/ap-test/devices/2 -d '
{
  "user" : "Earl",
  "macaddr" : "00:19:92:00:71:82"
}'

curl -XPUT http://localhost:9200/ap-test/devices/3 -d '
{
  "user" : "James Edward",
  "macaddr" : "11:19:92:00:71:80"
}'

curl -XPOST 'http://localhost:9200/ap-test/_refresh'
curl -XGET http://localhost:9200/ap-test/devices/_mapping?pretty

完全一致を見つけると、正しく取得できます....

curl -XPOST http://localhost:9200/ap-test/devices/_search -d '
{
    "query" : {
        "query_string" : {
            "query":"\"00\\:19\\:92\\:00\\:71\\:80\""
        }
    }
}'

# RETURNS:

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.57534903,
    "hits": [
      {
        "_index": "ap-test",
        "_type": "devices",
        "_id": "1",
        "_score": 0.57534903,
        "_source": {
          "user": "James Earl",
          "macaddr": "00:19:92:00:71:80"
        }
      }
    ]
  }
}

ただし、次のような部分的な MAC アドレス検索に一致させる必要があります。

curl -XPOST http://localhost:9200/ap-test/devices/_search -d '
{
    "query" : {
        "query_string" : {
            "query":"\"00\\:19\\:9\""
        }
    }
}'

# RETURNS 0 instead of returning 2 of them 

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

SO、どのマッピングを使用すればよいですか? これを達成するためのより良いクエリ文字列はありますか? ところで、「query_string」と「text」の使用の違いは何ですか?

4

2 に答える 2

2

いくつかの調査の後、私はそれを機能させるためのより簡単な方法を見つけました。

Elasticsearch クエリ オプションは非常に多くのオプションがあるため、時々混乱します...

  • query_string : 無数のオプションとワイルドカードを使用した本格的な検索があります。
  • match : より単純で、ワイルドカード文字やその他の「高度な」機能を必要としません。これは、存在しないとまではいかなくても、失敗する可能性が非常に低いため、検索ボックスで使用するのに最適です。

それで、それは言った。これは、ほとんどの場合に最適に機能し、カスタマイズされたマッピングを必要としませんでした。

curl -XPOST http://localhost:9200/ap-test/devices/_search -d '
{
    "query" : {
        "match_phrase_prefix" : {
            "_all" : "00:19:92:00:71:8"
        }
    }
}'
于 2013-07-24T22:18:26.697 に答える
2

マッピングをまったく定義していないようです。これは、elasticsearch がデータ型を推測し、標準のマッピングを使用することを意味します。

フィールド macaddr の場合、これは文字列として認識され、標準の文字列アナライザーが使用されます。このアナライザーは、空白と句読点で文字列を分割し、数字のペアで構成されるトークンを残します。たとえば"00:19:92:00:71:80"、 にトークン化され00 19 92 00 71 80ます。検索すると、同じトークン化が行われます。

あなたが望むのは"00:19:92:00:71:80"、トークン00 00: 00:1 00:19などに変わるアナライザーを定義することです...

これを試して:

curl -XPUT http://localhost:9200/ap-test  -d '
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "my_edge_ngram_analyzer" : {
                    "tokenizer" : "my_edge_ngram_tokenizer"
                }
            },
            "tokenizer" : {
                "my_edge_ngram_tokenizer" : {
                    "type" : "edgeNGram",
                    "min_gram" : "2",
                    "max_gram" : "17"
                }
            }
        }
    }
}'

curl -XPUT http://localhost:9200/ap-test/devices/_mapping  -d '
{
    "devices": {
        "properties" {
            "user": {
                "type": "string"
            },
            "macaddr": {
                "type": "string",
                "index_analyzer" : "my_edge_ngram_analyzer",
                "search_analyzer": "keyword"
            }
        }
    }
}'

前と同じようにドキュメントを配置し、具体的にフィールドを対象としたクエリで検索します。

curl -XPOST http://localhost:9200/ap-test/devices/_search -d '
{
    "query" : {
        "query_string" : {
            "query":"\"00\\:19\\:92\\:00\\:71\\:80\"",
            "fields": ["macaddr", "user"]
        }
    }
}'

最後の質問については、textクエリは非推奨です。

幸運を!

于 2013-07-24T16:42:40.690 に答える