2017-06-01 69 views
0

非常感谢@Random,我修改了映射,如下所示。为了测试,我用“电影”作为我的索引类型。 注意:我也添加了search_analyzer。没有那个,我没有得到正确的结果。 但是我有以下使用search_analyzer的疑虑。ElasticSearch:我们可以在索引过程中同时应用n-gram和语言分析器

1]我们可以在语言分析器的情况下使用自定义search_analyzer吗?
2]我得到所有的结果,由于我已经使用的非克分析仪,而不是由于英文分析仪?

{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "english_ngram": { 
        "type": "custom", 
        "filter": [ 
         "english_possessive_stemmer", 
         "lowercase", 
         "english_stop", 
         "english_stemmer", 
         "ngram_filter" 
        ], 
        "tokenizer": "whitespace" 
       }, 
       "search_analyzer":{ 
        "type": "custom", 
        "tokenizer": "whitespace", 
        "filter": "lowercase" 
       } 
      }, 
      "filter": { 
       "english_stop": { 
        "type": "stop" 
       }, 
       "english_stemmer": { 
        "type": "stemmer", 
        "language": "english" 
       }, 
       "english_possessive_stemmer": { 
        "type": "stemmer", 
        "language": "possessive_english" 
       }, 
       "ngram_filter": { 
        "type": "ngram", 
        "min_gram": 1, 
        "max_gram": 25 
       } 
      } 
     } 
    }, 
     "mappings": { 
    "movie": { 
     "properties": { 
     "title": { 
      "type": "string", 
      "fields": { 
      "en": { 
       "type":  "string", 
       "analyzer": "english_ngram", 
       "search_analyzer": "search_analyzer" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

更新:

使用搜索仪也无法工作consistently.and需要与我的发现this.Updating更多帮助。

我按照建议使用了以下映射(注意:该映射不使用搜索分析器),为了简单起见,我们只考虑英文分析器。

{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "english_ngram": { 
        "type": "custom", 
        "filter": [ 
         "english_possessive_stemmer", 
         "lowercase", 
         "english_stop", 
         "english_stemmer", 
         "ngram_filter" 
        ], 
        "tokenizer": "standard" 
       } 
      }, 
      "filter": { 
       "english_stop": { 
        "type": "stop" 
       }, 
       "english_stemmer": { 
        "type": "stemmer", 
        "language": "english" 
       }, 
       "english_possessive_stemmer": { 
        "type": "stemmer", 
        "language": "possessive_english" 
       }, 
       "ngram_filter": { 
        "type": "edge_ngram", 
        "min_gram": 1, 
        "max_gram": 25 
       } 
      } 
     } 
    } 
} 

创建索引:

PUT http://localhost:9200/movies/movie/1

{"title":"[email protected] movie"} 

尝试以下查询:

GET http://localhost:9200/movies/movie/_search 

    { 
     "query": { 
      "multi_match": { 
       "query": "$peci mov", 
       "fields": ["title"], 
       "operator": "and" 
      } 
      } 
     } 
    } 

我没有结果对于这一点,我在做什么错? 我想获得结果:

1] Special characters 
2] Partial matches 
3] Space separated partial and full words 

再次感谢!

回答

0

您可以创建基于语言分析器的自定义分析器。唯一的区别是您将ngram_filter标记过滤器添加到链的末尾。在这种情况下,你首先得到语言标记的标记(默认链),最终转换为边缘标记(你的过滤器)。你可以在这里找到https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#english-analyzer语言分析器的实现,以覆盖它们。下面是这个变化对于英语的例子:

{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "english_ngram": { 
        "type": "custom", 
        "filter": [ 
         "english_possessive_stemmer", 
         "lowercase", 
         "english_stop", 
         "english_stemmer", 
         "ngram_filter" 
        ], 
        "tokenizer": "standard" 
       } 
      }, 
      "filter": { 
       "english_stop": { 
        "type": "stop" 
       }, 
       "english_stemmer": { 
        "type": "stemmer", 
        "language": "english" 
       }, 
       "english_possessive_stemmer": { 
        "type": "stemmer", 
        "language": "possessive_english" 
       }, 
       "ngram_filter": { 
        "type": "edge_ngram", 
        "min_gram": 1, 
        "max_gram": 25 
       } 
      } 
     } 
    } 
} 

UPDATE

为了支持特殊字符,你可以尝试使用whitespace标记生成器,而不是standard。在这种情况下,这些字符将成为你的符号的一部分:

{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 
       "english_ngram": { 
        "type": "custom", 
        "filter": [ 
         "english_possessive_stemmer", 
         "lowercase", 
         "english_stop", 
         "english_stemmer", 
         "ngram_filter" 
        ], 
        "tokenizer": "whitespace" 
       } 
      }, 
      "filter": { 
       "english_stop": { 
        "type": "stop" 
       }, 
       "english_stemmer": { 
        "type": "stemmer", 
        "language": "english" 
       }, 
       "english_possessive_stemmer": { 
        "type": "stemmer", 
        "language": "possessive_english" 
       }, 
       "ngram_filter": { 
        "type": "edge_ngram", 
        "min_gram": 1, 
        "max_gram": 25 
       } 
      } 
     } 
    } 
} 
+0

感谢很多随机的,你的回答确实有帮助,但我对这个有些怀疑,我已经再次修改我的问题,你可以请帮助? – SSG

+0

您能否提供一个例子,您的'search_analyzer'比原来的更好?顺便说一句,你最好保留原来的答案,只需添加一个“更新”部分的修正案,甚至要求一个单独的问题,否则它会增加一些混淆 – Random

+0

嗨随机!对延迟响应抱歉,但看起来像使用search_analyzer也不一致,我更新了我的问题,在更新部分。如果你可以看一看,这将是很大的帮助。 – SSG

相关问题