我在我的elasticsearch索引中有一个"name" field - not_analyzed
。Elasticsearch - 与部分搜索词匹配not_analyzed字段
可以说价值"name" field
是"some name"
。我的问题是,如果我想匹配搜索词 - some name some_more_name someother name
,因为它包含some name
,那么not_analyzed
会允许匹配发生,如果不匹配,那么我如何才能匹配搜索词?
我在我的elasticsearch索引中有一个"name" field - not_analyzed
。Elasticsearch - 与部分搜索词匹配not_analyzed字段
可以说价值"name" field
是"some name"
。我的问题是,如果我想匹配搜索词 - some name some_more_name someother name
,因为它包含some name
,那么not_analyzed
会允许匹配发生,如果不匹配,那么我如何才能匹配搜索词?
索引期间name
字段的文本存储在倒排索引中。如果分析此字段,则将使用2个术语进入倒排索引:some
和name
。但由于未分析,因此只存储一项:some name
在搜索过程中(使用匹配查询),默认情况下会分析并标记化搜索查询。所以会有几个术语:some
,name
,some_more_name
和someother
。然后Elasticsearch将查看倒排索引以查看搜索查询中是否至少有一个词条。但是只有some name
术语,所以您不会在结果集中看到此文档。
您可以用分析仪端点
回到你的问题,如果你想获得建议的搜索查询的比洞赛,你的领域必须进行分析。
如果您需要保留非分析版本,以及你应该使用multi fields:
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"name": {
"type": "keyword",
"fields": {
"analyzed": {
"type": "text"
}
}
}
}
}
}
}
塔拉斯已经解释清楚了,我问题可能已经解决,但还是如果你不能改变你的索引的映射,您可以使用查询(我已经在5.4 ES测试)
GET test/_search
{
"query": {
"query_string": {
"default_field": "namekey",
"query": "*some* *name*",
"default_operator": "OR"
}
}
使用通配符总是会影响性能,特别是如果'一些name'实际上是'some1 some2 some3 some4名1名2 NAME3 name4',相关 - https://开头讨论.elastic.co /吨/精确匹配-IN-A-未分析场/ 37121 – vjjj