【发布时间】:2020-06-25 04:27:18
【问题描述】:
我想创建一个包含名为“home_city”的字段的索引。 我将需要在这个索引上执行搜索,返回所有带有 home_city 字段的文档,该字段正好是“Little Rock”。 我还需要对该索引执行搜索,该索引返回所有带有 home_city 字段的文档,该字段包含以查询字符串为前缀的任何单词。例如,如果查询字符串是“Ne”,那么 home_city = “New York” 或 home_city = “Long Neck” 或 home_city = “Nevinton” 的文档将出现在结果中。
我可以创建一个允许这两个查询之一的索引,但不能同时允许。
例如,如果我指示索引使用 Elastic 的“关键字”分析器,前一个搜索(确切的完整关键字搜索)就可以工作。我在创建这样的索引时指定了这一点...
PUT my_index
{
"mappings":{
"properties":{
"home_city": {
"type":"text",
"analyzer":"keyword",
}
}
}
}
以下查询正确返回所有带有 home_city = "Little Rock" 字段的文档
{
"query": {
"bool": {
"must": [
{
"query_string":{
"query":"Little Rock"
}
}]
}
}
}
此外,正如预期的那样,如果查询不完全是“Little Rock”,而是“Little”或“Rock”,则响应不包括 home_city="Little Rock" 的文档。很好,这就是我们想要的。
如果我使用默认设置创建索引,则后一种(前缀匹配)搜索有效。 查询看起来像这样...
{
"query": {
"match": {
"home_city": "Di"
}
}
}
返回字段 home_city = "San Diego" 的文档和字段 home_city = "Diamondville" 的文档。
但是,我无法让这两个查询在同一个索引上工作。如果我在创建索引时指定关键字分析器,并执行第二个查询(前缀匹配查询),则没有文档匹配。
如何创建一个索引帽子,它将与查找与整个查询字符串完全匹配的文档的查询以及查找包含该查询作为前缀的文档的查询一起使用。
最终,我们有兴趣将前缀匹配替换为更复杂的匹配,包括前缀匹配以及其他技术。但是现在,我们只想弄清楚上面描述的问题。
干杯。
【问题讨论】:
-
这个博客可能对你有帮助 opster.com/elasticsearch-glossary/…
-
你还面临这个问题吗
标签: elasticsearch indexing lucene tokenize prefix