Elasticsearch | copy_to部分搜索
我有copy_to正确匹配工作,但我无法正确设置与部分匹配。以下是我的映射/设置和查询与预期和实际结果。Elasticsearch | copy_to部分搜索
设置:
{
"test": {
"settings": {
"index": {
"analysis": {
"filter": {
"ngram_filter": {
"type": "edge_ngram",
"min_gram": "1",
"max_gram": "15"
}
},
"analyzer": {
"ngram_analyzer": {
"filter": [
"lowercase",
"ngram_filter"
],
"type": "custom",
"tokenizer": "standard"
}
}
},
"number_of_shards": "1",
"number_of_replicas": "1",
}
}
}
}
映射:
POST /test/_mapping/name
{
"name": {
"properties": {
"vital": {
"properties": {
"first": {
"type": "string",
"copy_to": "full_name",
"term_vector": "yes",
"analyzer": "ngram_analyzer",
"search_analyzer": "standard"
},
"last": {
"type": "string",
"copy_to": "full_name",
"term_vector": "yes",
"analyzer": "ngram_analyzer",
"search_analyzer": "standard"
},
"full_name": {
"type": "string",
"term_vector": "yes",
"analyzer": "ngram_analyzer",
"search_analyzer": "standard"
}
}
}
}
}
}
POST:
POST /test/name
{
"vital": {
"first": "Tom",
"last": "Doe"
}
}
现在,当我做搜索...
GET /test/name/_search
{
"query": {
"match": {
"full_name": {
"query": "Tom Doe",
"operator": "and"
}
}
}
}
...我找回结果!! Hurrraaaay,但如果我做了搜索....
GET /test/name/_search
{
"query": {
"match": {
"full_name": {
"query": "Tom Do",
"operator": "and"
}
}
}
}
...我回来没有结果:(我想部分匹配为FULL_NAME工作,以及作为另一个不是我能够成功地因部分匹配的名字和姓氏,只是full_name不起作用,我会怎么做呢?
你在映射中有一个小错误,你需要复制fir st和姓氏放到vital.full_name
字段中,而不是full_name
,否则会在映射的顶层创建一个名为full_name
的新字符串字段,并在标准分析器的顶层显示该字段(如果运行GET test
,则会看到映射中的新字段):
POST /test/_mapping/name
{
"name": {
"properties": {
"vital": {
"properties": {
"first": {
"type": "string",
"copy_to": "vital.full_name", <--- fix this
"term_vector": "yes",
"analyzer": "ngram_analyzer",
"search_analyzer": "standard"
},
"last": {
"type": "string",
"copy_to": "vital.full_name", <--- fix this
"term_vector": "yes",
"analyzer": "ngram_analyzer",
"search_analyzer": "standard"
},
"full_name": {
"type": "string",
"term_vector": "yes",
"analyzer": "ngram_analyzer",
"search_analyzer": "standard"
}
}
}
}
}
}
,然后修复您的疑问是这样的:
POST /test/name/_search
{
"query": {
"match": {
"vital.full_name": { <-- fix this
"query": "Tom Doe",
"operator": "and"
}
}
}
}
POST /test/name/_search
{
"query": {
"match": {
"vital.full_name": { <-- fix this
"query": "Tom Do",
"operator": "and"
}
}
}
}
像您期望双方会工作。
只是从你映射中删除"search_analyzer": "standard"
,它只是在某些用例中需要的东西,比如自动完成搜索。这里https://www.elastic.co/guide/en/elasticsearch/guide/master/_index_time_search_as_you_type.html
我刚试过你的方法,不幸的是它不会返回full_name的部分匹配 – emarel
还需要什么? – Val
不,不错! – emarel