elasticsearch 当单词混合了数字和字母时,使用类型phrase_prefix进行匹配不起作用

gajydyqb  于 2023-03-29  发布在  ElasticSearch
关注(0)|答案(2)|浏览(182)

我试着这样查询:

{
   "match": {
      "query": "100",
      "fields": "description",
      "type": "phrase_prefix"
   }
}

但是,如果我搜索“100”,想要找到一个“description”为“pipe 100mm”的文档,它不会给我带来这个文档作为结果,它只匹配“100”作为其他数字的前缀(即10056)或作为一个完整的单词。
我正在使用Javascript客户端。描述是Map为文本的字段。
在这种情况下,phrase_prefix有什么限制,我可以在查询中更改什么,以便获得想要的结果?
我的字段Map是

{
   "description": {
      "type": "text",
      "fields": {
         "keyword": {
            "type": "keyword"
         }
      }
   },
   "analyzer": "ac_filter"
}

所示的分析仪构建为

"analysis": {
    "analyzer": {
        "accent_filter": {
            "filter": [
                "lowercase",
                "asciifolding"
            ],
            "char_filter": [
                "alphabets_char_filter"
            ],
            "type": "custom",
            "tokenizer": "standard"
            }
        },
        "char_filter": {
            "alphabets_char_filter": {
                "pattern": "[^\\p{L}\\p{Nd}]",
                "type": "pattern_replace",
                "replacement": " "
            }
        }
}

我还没有尝试使用ngram或search_as_you_type,因为我想知道为什么上面的方法不起作用。如果没有解决方法,请告诉我。
谢谢。

798qvoo8

798qvoo81#

使用match_phrase_prefix

{
    "query": {
        "match_phrase_prefix": {
            "description": {
                "query": "100"
            }
        }
    }
}

响应

{
    "took": 77,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 0.8025915,
        "hits": [
            {
                "_index": "test_phrase",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.8025915,
                "_source": {
                    "description": "10056"
                }
            },
            {
                "_index": "test_phrase",
                "_type": "_doc",
                "_id": "zQV_KIcBceOx_UfLZ8wC",
                "_score": 0.60996956,
                "_source": {
                    "description": "pipe 100mm"
                }
            }
        ]
    }
e4yzc0pl

e4yzc0pl2#

您可以使用multi match query
例如:

{
  "query": {
    "multi_match": {
      "query": "100",
      "fields": ["fieldA", "fieldB"],
      "type": "phrase_prefix"
    }
  }
}

相关问题