gpt4 book ai didi

elasticsearch - 对ElasticSearch中的不同字段使用不同的查询来匹配和突出显示文档

转载 作者:行者123 更新时间:2023-12-02 22:43:13 25 4
gpt4 key购买 nike

我的目标是创建一个查询,该查询将对文档的字段A,B和C使用常规的query_string查询来找到“最佳”的20个文档,并尝试对字段D进行完全匹配或完全匹配。例如:如果字段D为“AAA.BBB.CCC.DDD”,则查询“AAA.BBB”应匹配(以及“BBB.CCC”和“AAA.BBB.CCC”等)。哦,是的,我也想获得突出显示的结果。

迄今为止,我最接近的尝试是在字段D上使用ngram标记器/分析器,并且仅允许A,B,C正常索引。

{
"settings": {
"number_of_shards": 5,
"index": {
"analysis": {
"tokenizer": {
"customNgram": {
"type": "nGram",
"min_gram": "3",
"max_gram": "5"
}
},
"analyzer": {
"lllNgram": {
"type": "custom",
"filter": "lowercase",
"tokenizer": "customNgram"
}
}
}
}
},
"mappings": {
"lessons": {
"_id": {
"path": "id"
},
"properties": {
"id": {
"type": "integer"
},
"A": {
"type": "string",
"store": "yes"
},
"B": {
"type": "string",
"store": "yes"
},
"C": {
"type": "string",
"store": "yes"
},
"D": {
"type": "string",
"store": "yes",
"analyzer": "lllNgram"
}
}
}
}
}

然后使用如下查询:
{
"size":20,
"query":{
"filtered":{
"query":{
"match_all":{}
},
"filter":{
"or":[
{
"query":{
"query_string":{
"query":"XYZZY TOP",
"fields":["A","B","C"]
}
}
},
{
"query":{
"match":{
"D": {
"query":"XYZZY TOP",
"operator" : "and"
}
}
}
}
]
}
}
},
"highlight":{
"pre_tags":["<em>"],
"post_tags":["<\/em>"],
"fields":{
"A":{},
"B":{},
"C":{},
"D":{}
}
}
}

问题在于,字段D似乎从不匹配任何内容,无论如何。结果集也不包含此查询的任何突出显示。

所以,请帮助我了解我在查询中做错了什么。

最佳答案

映射/查询中有几个问题:

  • ngram大小错误:您定义ngram(3, 5),因此生成的术语的最大长度仅为5,然后查询AAA.BBB(长度= 7)。它可以在您的映射中匹配,但是它是无效的,并且在这种情况下是错误的设计(将其用于索引和搜索是错误的),您可以将其扩展为ngram(3, 20)并将其仅用于索引时间。
  • 无效的映射:您无需为索引/搜索都定义ngram。相反,您可以定义index_analyzer = lllNgram,然后使用不修改search_analyzer数据的分析器,例如,在我的示例中为search_analyzer = keyword_lowercase_analyzer。为数据建立索引时使用index_analyzer,因此我们需要定义规则以生成所有可能匹配的术语(在本例中为ngram),在与索引数据进行比较之前解析查询时使用search_analyzer,因此我们只需要定义规则以将其保留为在这种情况下是原始的(只是小写)
  • 不合条件查询:为什么要使用过滤查询?它将省略ES分数,并且您将无法获得the "best" 20 documents结果。

  • 这是一个可行的映射/查询:
    {
    "settings": {
    "number_of_shards": 5,
    "index": {
    "analysis": {
    "tokenizer": {
    "customNgram": {
    "type": "nGram",
    "min_gram": "3",
    "max_gram": "20"
    }
    },
    "analyzer": {
    "lllNgram": {
    "type": "custom",
    "filter": "lowercase",
    "tokenizer": "customNgram"
    },
    "keyword_lowercase_analyzer": {
    "tokenizer": "keyword",
    "filter": ["lowercase"]
    }
    }
    }
    }
    },
    "mappings": {
    "lessons": {
    "_id": {
    "path": "id"
    },
    "properties": {
    "id": {
    "type": "integer"
    },
    "A": {
    "type": "string",
    "store": "yes"
    },
    "B": {
    "type": "string",
    "store": "yes"
    },
    "C": {
    "type": "string",
    "store": "yes"
    },
    "D": {
    "type": "string",
    "store": "yes",
    "index" : "analyzed",
    "index_analyzer" : "lllNgram",
    "search_analyzer" : "keyword_lowercase_analyzer",
    "term_vector" : "with_positions_offsets"
    }
    }
    }
    }
    }

    查询:
    {
    "size": 20,
    "query": {
    "bool": {
    "should": [
    {
    "query_string": {
    "query": "AAA.BBB",
    "fields": [
    "A",
    "B",
    "C"
    ]
    }
    },
    {
    "match": {
    "D": {
    "query": "AAA.BBB",
    "operator": "or"
    }
    }
    }
    ]
    }
    },
    "highlight": {
    "pre_tags": [
    "<em>"
    ],
    "post_tags": [
    "</em>"
    ],
    "fields": {
    "A": {},
    "B": {},
    "C": {},
    "D": {}
    }
    }
    }

    注意:
  • 我使用with_positions_offsets来更快地突出显示术语。可以在这里引用更多信息:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-highlighting.html
  • 您可以安装inquisitor插件来测试分析仪,它将帮助您找出类似的问题。
  • 关于elasticsearch - 对ElasticSearch中的不同字段使用不同的查询来匹配和突出显示文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20696997/

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