创建ElasticSearch查询以搜索所有字段并同时使用部分匹配

时间:2014-02-12 15:16:45

标签: elasticsearch

另外,我有部分搜索工作,我可以搜索所有字段。但是我无法在映射所有字段的搜索上使用部分匹配。

当我使用部分匹配时,这会返回我的名字:

GET /_search?pretty=true
{ 
    "query": {
        "match": {
            "FullName": "andon"
        }
    }
}

此搜索在所有字段上运行,但不进行部分匹配(0次点击):

GET /_search?pretty=true
{
    "query": {
        "match": {
           "_all": "andon"
        }
    }
}

我需要做些什么才能将部分匹配与所有字段上的搜索相结合。类型?我有很多字段和类型,所以我希望避免必须手动指定它们。

如果它有任何区别,我将从连接到SQL的River插入我的数据。

编辑:我现在在我的映射中有_all字段。它似乎没有任何区别。

PUT /contact/
{
    "settings" : {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "my_ngram_analyzer" : {
                        "tokenizer" : "my_ngram_tokenizer"
                    }
                },
                "tokenizer" : {
                    "my_ngram_tokenizer" : {
                        "type" : "nGram",
                        "min_gram" : "1",
                        "max_gram" : "10"
                    }
                }
            }
        }
    },
    "mappings": {
        "_default_": {
            "_all" : {"enabled" : true},
            "properties" : {
                "Description":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"},
                "OfficePhone":{"type":"string","store":"yes"},
                "Email":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"},
                "FullName":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"},
                "ReportsTo":{"type":"string","store":"yes"},
                "Department":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"},
                "Title":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}
            }
        }
    }
}

2 个答案:

答案 0 :(得分:24)

_all-field通过获取所有字段的文本,通过分析器传递_allstandard除非被覆盖),然后索引生成的术语。

取分析器为其他字段制作的任何条款,并将它们全部推送到同一个字段中。

因此,您必须覆盖_all - 字段才能使用自定义分析器。

但是!我不认为你真的想这样做。您将获得更大的索引。 _all有时很方便,但通常最好控制在搜索时搜索哪些字段。

因此,您可能希望使用multi_match来指定字段,而不是在match上执行_all。如果您使用1.0,也可以考虑copy_to

答案 1 :(得分:1)

我尝试使用通配符(%2A)进行搜索,并且能够进行部分搜索

ex => Q =咀嚼%2A和;大小= 100