所以我正在建立一个索引,我想进行一次搜索,对一个字段进行部分字edge_ngram
搜索,并对其余字段进行更正常的搜索。根据我的理解,只需匹配_all
即可轻松完成。但是我似乎无法让它发挥作用。
我已经能够从bool
查询获得所需的结果,该查询分别搜索_all
和特定的ngram字段,但这看起来像是hackey,我猜我只有一些简单的东西,我是丢失。
这里只是一个最小的例子来展示我正在做什么以及它对我不起作用。
这是索引设置:
curl -XPUT "http://localhost:9200/test_index?pretty=true" -d'
{
"settings": {
"analysis": {
"filter": {
"edge_ngram_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20
}
},
"analyzer": {
"edge_ngram_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"edge_ngram_filter"
]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"text_field": {
"type": "string",
"analyzer": "edge_ngram_analyzer",
"search_analyzer": "standard"
}
}
}
}
}'
并添加一个简单的文档:
curl -XPUT "http://localhost:9200/test_index/doc/1?pretty=true" -d'
{
"text_field": "Hello, World!"
}'
_所有部分搜索都不起作用。它返回一个空结果。
curl -XPOST "http://localhost:9200/test_index/_search?pretty=true" -d'
{
"query": {
"match": {
"_all": "hell"
}
}
}'
_所有全文搜索都可以使用
curl -XPOST "http://localhost:9200/test_index/_search?pretty=true" -d'
{
"query": {
"match": {
"_all": "hello"
}
}
}'
部分搜索特定字段
curl -XPOST "http://localhost:9200/test_index/_search?pretty=true" -d'
{
"query": {
"match": {
"text_field": "hell"
}
}
}'
术语矢量看起来也很好
curl -XGET "http://localhost:9200/test_index/doc/1/_termvector?fields=text_field&pretty=true"
我真的无法弄清楚我在这里做错了什么。任何帮助将不胜感激。
以下是有关我的环境的一些细节。
Version: 2.3.3, Build: 218bdf1/2016-05-17T15:40:04Z, JVM: 1.8.0_92
4.4.3-1-custom
答案 0 :(得分:1)
action_name == "index"
字段将所有字段的原始值组合为字符串,而不是为每个字段生成的字词。因此,在您的情况下,它不包含_all
生成的字词,只包含edge_ngram_analyzer
字段中的文字。它就像任何其他文本字段一样,您可以为它指定分析器等。在您的示例中,它使用默认分析器。