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": []
  }
}

那么,我应该使用什么映射?是否有更好的查询字符串来完成此操作?顺便说一句,使用'query_string'和'text'有什么区别?

4

2 回答 2

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 回答
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 回答