gpt4 book ai didi

elasticsearch 不区分大小写的术语过滤器搜索 not_analyzed 字段

转载 作者:行者123 更新时间:2023-11-29 02:49:53 24 4
gpt4 key购买 nike

这里也有类似的问题问Elasticsearch Map case insensitive to not_analyzed documents ,但是我的情况略有不同,因为我处理特殊字符。

大多数人建议结合使用关键字分析器小写过滤器。但是,这对我的情况不起作用,因为关键字分析器标记空格和特殊字符,如 ^、# 等。这打破了我想要的支持类型。

  1. ^HELLOWORLD应该通过搜索^helloworld来匹配,而不是helloworld
  2. #FooBar 应该匹配 #foobar 而不是 foobar
  3. Foo Bar 应与 foo bar 匹配,但不能与 foobar 匹配。

与我们在这里看到的功能类似 https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_exact_values.html#_term_filter_with_numbers , 但不区分大小写。

有谁知道如何做到这一点?

编辑 1:

看来我的问题的核心是多字段,因为关键字+小写似乎解决了标题中提出的问题。但是,针对多字段值属性提出这个问题会更准确。

test_mapping.json:

{
"properties" : {
"productID1" : {
"type" : "string",
"index_analyzer" : "keyword_lowercase",
"search_analyzer" : "keyword_lowercase"
},
"productID2" : {
"type": "multi_field",
"keyword_edge_ID": {
"type": "string",
"index_analyzer":"keyword_lowercase_edge",
"search_analyzer":"keyword_lowercase_edge"
},
"productID2": {
"type": "string",
"index": "analyzed",
"store": "yes",
"index_analyzer":"keyword_lowercase",
"search_analyzer":"keyword_lowercase"
}
}
}
}

测试.json:

{
"index": {
"analysis": {
"filter":{
"edgengramfilter": {
"type": "edgeNgram",
"side": "front",
"min_gram": 1,
"max_gram": 32
}
},
"analyzer": {
"keyword_lowercase" : {
"type" : "custom",
"tokenizer": "keyword",
"filter": "lowercase"
},
"keyword_lowercase_edge": {
"tokenizer": "keyword",
"filter": ["lowercase", "edgengramfilter"]
}
}
}
}
}

使用映射创建索引的 Shell 脚本:

#!/bin/sh

ES_URL="http://localhost:9200"

curl -XDELETE $ES_URL/test
curl -XPOST $ES_URL/test/ --data-binary @test.json
curl -XPOST $ES_URL/test/query/_mapping --data-binary @test_mapping.json

POST localhost:9200/test/query:

{ 
"productID1" : "^A",
"productID2" : "^A"
}

我想要它以便我可以用“^A”匹配 productID2,但它现在没有返回任何结果,但是当我对 productID1 执行相同的查询时它会起作用。 {“查询”:{“匹配”:{“产品ID2”:“^A”}}}

最佳答案

正如您在下面的示例中看到的,keyword tokenizerlowercase 过滤器正是这样做的 - 它在将整个值小写的同时保留所有空格和特殊字符。如何使用它的示例可以在 this answer 中找到。 .

curl "localhost:9200/_analyze?pretty&tokenizer=keyword&filters=lowercase" -d "^HELLOWORLD"
{
"tokens" : [ {
"token" : "^helloworld",
"start_offset" : 0,
"end_offset" : 11,
"type" : "word",
"position" : 1
} ]
}

curl "localhost:9200/_analyze?pretty&tokenizer=keyword&filters=lowercase" -d "#FooBar"
{
"tokens" : [ {
"token" : "#foobar",
"start_offset" : 0,
"end_offset" : 7,
"type" : "word",
"position" : 1
} ]
}

curl "localhost:9200/_analyze?pretty&tokenizer=keyword&filters=lowercase" -d "Foo Bar"
{
"tokens" : [ {
"token" : "foo bar",
"start_offset" : 0,
"end_offset" : 7,
"type" : "word",
"position" : 1
} ]
}

关于elasticsearch 不区分大小写的术语过滤器搜索 not_analyzed 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com