作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了2个自定义分析器,如下所示,但两者均无法按我的要求工作。
这是我想要的倒排索引
例如;对于单词reb-tn2000xxxl
我需要
我的反向索引中的reb,tn2000xxl和reb-tn2000xxxl。
{
"analysis":{
"filter":{
"my_word_delimiter":{
"split_on_numerics":"true",
"generate_word_parts":"true",
"preserve_original":"true",
"generate_number_parts":"true",
"catenate_all":"true",
"split_on_case_change":"true",
"type":"word_delimiter"
}
},
"analyzer":{
"my_analyzer":{
"filter":[
"standard",
"lowercase",
"my_word_delimiter"
],
"type":"custom",
"tokenizer":"whitespace"
},
"standard_caseinsensitive":{
"filter":[
"standard",
"lowercase"
],
"type":"custom",
"tokenizer":"keyword"
},
"my_delimiter":{
"filter":[
"lowercase",
"my_word_delimiter"
],
"type":"custom",
"tokenizer":"standard"
}
}
}
}
my_analyzer
token 生成器的
whitespace
,如果我使用curl检查结果将如下所示
curl -XGET "index/_analyze?analyzer=my_analyzer&pretty=true" -d "reb-tn2000xxxl"
{
"tokens" : [ {
"token" : "reb-tn2000xxxl",
"start_offset" : 0,
"end_offset" : 14,
"type" : "word",
"position" : 0
}, {
"token" : "reb",
"start_offset" : 0,
"end_offset" : 3,
"type" : "word",
"position" : 0
}, {
"token" : "rebtn2000xxxl",
"start_offset" : 0,
"end_offset" : 14,
"type" : "word",
"position" : 0
}, {
"token" : "tn",
"start_offset" : 4,
"end_offset" : 6,
"type" : "word",
"position" : 1
}, {
"token" : "2000",
"start_offset" : 6,
"end_offset" : 10,
"type" : "word",
"position" : 2
}, {
"token" : "xxxl",
"start_offset" : 10,
"end_offset" : 14,
"type" : "word",
"position" : 3
} ]
}
tn2000xxxl
拆分,如果我使用
standard
标记器而不是
whitespace
可以获得,但是问题是一旦我使用
my_delimiter
自定义分析器之类的标准就可以了。我在倒排索引中没有原始值。看来
standard
tokinezer和
preserve_original
过滤器一起无法使用。我在某处读到,因为标准 token 生成器在应用过滤器之前已经在原始对象上拆分了,所以这就是为什么原始对象不再是相同的原因。但是如何实现此任务以防止像标准 token 生成器一样拆分原始文档?
curl -XGET "index/_analyze?analyzer=my_delimiter&pretty=true" -d "reb-tn2000xxxl"
{
"tokens":[
{
"token":"reb",
"start_offset":0,
"end_offset":3,
"type":"<ALPHANUM>",
"position":0
},
{
"token":"tn2000xxxl",
"start_offset":4,
"end_offset":14,
"type":"<ALPHANUM>",
"position":1
},
{
"token":"tn",
"start_offset":4,
"end_offset":6,
"type":"<ALPHANUM>",
"position":1
},
{
"token":"tn2000xxxl",
"start_offset":4,
"end_offset":14,
"type":"<ALPHANUM>",
"position":1
},
{
"token":"2000",
"start_offset":6,
"end_offset":10,
"type":"<ALPHANUM>",
"position":2
},
{
"token":"xxxl",
"start_offset":10,
"end_offset":14,
"type":"<ALPHANUM>",
"position":3
}
]
}
最佳答案
在Elasticsearch中,您可以在映射上具有多个字段。您描述的行为实际上很常见。您可以使用text
分析器和standard
字段来分析您的主要keyword
字段。这是文档中使用多字段的映射示例。 https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
"city"
字段将使用
standard
分析器进行分析,而
"city.raw"
将是未经分析的
keyword
。换句话说,
"city.raw"
是原始字符串。
关于elasticsearch - 如何将标准 token 生成器与preserve_original一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52891475/
我是一名优秀的程序员,十分优秀!