elasticsearch Elasticsearch匹配查询不匹配带撇号的文档,elasticsearch,autocomplete,elasticsearch,Autocomplete" /> elasticsearch Elasticsearch匹配查询不匹配带撇号的文档,elasticsearch,autocomplete,elasticsearch,Autocomplete" />

elasticsearch Elasticsearch匹配查询不匹配带撇号的文档

elasticsearch Elasticsearch匹配查询不匹配带撇号的文档,elasticsearch,autocomplete,elasticsearch,Autocomplete,我正在为localities autocomplete构建一个搜索程序,它是Google Maps one的一个简单版本。我使用的查询似乎一切正常: { "query": { "bool": { "must": { "multi_match": { "query": "Ametlla", "

我正在为localities autocomplete构建一个搜索程序,它是Google Maps one的一个简单版本。我使用的查询似乎一切正常:

{
  "query": {
    "bool": {
      "must": {
        "multi_match": {
          "query": "Ametlla",
          "type": "best_fields",
          "fields": [
            "locality",
            "alternative_names"
          ],
          "operator": "and"
        }
      },
      "filter": {
        "term": {
          "country_code": "ES"
        }
      }
    }
  }
}
我发现的问题与西班牙的一座城市有关:Lametlla de Mar

/localities\u索引/localities/10088

{
  "_index": "localities_index",
  "_type": "localities",
  "_id": "10088",
  "_version": 1,
  "_seq_no": 133,
  "_primary_term": 4,
  "found": true,
  "_source": {
    "country_code": "es",
    "locality": "L'Ametlla de Mar",
    "alternative_names": []
  }
}
您可以搜索
Ametlla
,并将其匹配(请参见下面的部分名称示例查询)

/localities\u index/localities/10088/\u explain

{
  "_index": "localities_index",
  "_type": "localities",
  "_id": "10088",
  "matched": true,
  "explanation": {
    "value": 3.3985975,
    "description": "weight(locality:ametlla in 2) [PerFieldSimilarity], result of:",
    "details": [
      {
        "value": 3.3985975,
        "description": "score(freq=1.0), product of:",
        "details": [
          {
            "value": 2.2,
            "description": "boost",
            "details": []
          },
          {
            "value": 3.6686769,
            "description": "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
            "details": [
              {
                "value": 2,
                "description": "n, number of documents containing term",
                "details": []
              },
              {
                "value": 97,
                "description": "N, total number of documents with field",
                "details": []
              }
            ]
          },
          {
            "value": 0.4210829,
            "description": "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
            "details": [
              {
                "value": 1.0,
                "description": "freq, occurrences of term within document",
                "details": []
              },
              {
                "value": 1.2,
                "description": "k1, term saturation parameter",
                "details": []
              },
              {
                "value": 0.75,
                "description": "b, length normalization parameter",
                "details": []
              },
              {
                "value": 9.0,
                "description": "dl, length of field",
                "details": []
              },
              {
                "value": 7.5360823,
                "description": "avgdl, average length of field",
                "details": []
              }
            ]
          }
        ]
      }
    ]
  }
}
但如果你使用它的全名,它就不是

我曾尝试将
标点符号
添加到token\u chars中,正如我在上所看到的,但没有成功。因此,我尝试将
'
添加为
自定义令牌\u字符
,但也没有效果。 /localities\u index/\u设置

{
  "localities_index": {
    "settings": {
      "index": {
        "number_of_shards": "1",
        "provided_name": "localities_index",
        "creation_date": "1596537683568",
        "analysis": {
          "analyzer": {
            "autocomplete": {
              "filter": [
                "lowercase",
                "asciifolding"
              ],
              "tokenizer": "autocomplete"
            },
            "autocomplete_search": {
              "filter": [
                "lowercase",
                "asciifolding"
              ],
              "tokenizer": "lowercase"
            }
          },
          "tokenizer": {
            "autocomplete": {
              "token_chars": [
                "letter",
                "digit"
              ],
              "custom_token_chars": "'",
              "min_gram": "1",
              "type": "edge_ngram",
              "max_gram": "15"
            }
          }
        },
        "number_of_replicas": "1",
        "uuid": "lS3Ork2zSySYJbJYmx29aw",
        "version": {
          "created": "7040099"
        }
      }
    }
  }
}
/localities\u index/\u mapping

{
  "localities_index": {
    "mappings": {
      "properties": {
        "alternative_names": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        },
        "country_code": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "locality": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        }
      }
    }
  }
}

您可以在自定义分析器中使用,并在字段(包含它们的位置)上使用,还可以使用您已经在使用的
匹配
查询,因为它将使用索引时使用的同一分析器,您将获得预期的结果。

如果我删除文档并再次添加它,它将与该筛选器一起工作。但是,如果我关闭索引,更新设置并添加标记过滤器,然后重新打开索引,则该操作不起作用。@blacksoul您需要重新为文档编制索引,然后只有它将更新的标记存储在反向索引中并起作用。很高兴它对您有效,只需重新编制所有文档的索引,您就可以开始了,也别忘了向上投票并接受答案:)
{
  "localities_index": {
    "mappings": {
      "properties": {
        "alternative_names": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        },
        "country_code": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "locality": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "autocomplete_search"
        }
      }
    }
  }
}