Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的Elasticsearch多匹配查询只查找前缀? - Fatal编程技术网

为什么我的Elasticsearch多匹配查询只查找前缀?

为什么我的Elasticsearch多匹配查询只查找前缀?,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我正在尝试编写一个Elasticsearch多匹配查询(使用JavaAPI)来创建一个“键入时搜索”程序。该查询应用于两个字段,title和description,它们被分析为ngrams 我的问题是,Elasticsearch似乎只尝试查找像我的查询一样的开头的单词。例如,如果我搜索“nut”,那么它将匹配具有“nut”、“nuts”、“Nutella”等特征的文档,但它不匹配具有“walnut”特征的文档,而“walnut”应该匹配 以下是我的设置: { "index": {

我正在尝试编写一个Elasticsearch多匹配查询(使用JavaAPI)来创建一个“键入时搜索”程序。该查询应用于两个字段,
title
description
,它们被分析为ngrams

我的问题是,Elasticsearch似乎只尝试查找像我的查询一样的开头的单词。例如,如果我搜索“nut”,那么它将匹配具有“nut”、“nuts”、“Nutella”等特征的文档,但它不匹配具有“walnut”特征的文档,而“walnut”应该匹配

以下是我的设置:

{
    "index": {
        "analysis": {
            "analyzer": {
                "edgeNGramAnalyzer": {
                    "tokenizer": "edgeTokenizer",
                    "filter": [
                        "word_delimiter",
                        "lowercase",
                        "unique"
                    ]
                }
            },
            "tokenizer": {
                "edgeTokenizer": {
                  "type": "edgeNGram",
                  "min_gram": "3",
                  "max_gram": "8",
                  "token_chars": [
                    "letter",
                    "digit"
                  ]
                }
            }
        }
    }
}
以下是我的映射的相关部分:

{
    "content": {
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "edgeNGramAnalyzer",
                "fields": {
                    "sort": { 
                        "type": "keyword"
                    }
                }
            },
            "description": {
                "type": "text",
                "analyzer": "edgeNGramAnalyzer",
                "fields": {
                    "sort": { 
                        "type": "keyword"
                    }
                }
            }
        }
    }
}
我的问题是:

new MultiMatchQueryBuilder(query).field("title", 3).field("description", 1).fuzziness(0).tieBreaker(1).minimumShouldMatch("100%")

你知道我可能做错了什么吗?

那是因为你使用的是标记器而不是标记器。前者只索引前缀,而后者将索引前缀、后缀以及数据的子部分

将您的analyzer定义改为此,它应按预期工作:

{
    "index": {
        "analysis": {
            "analyzer": {
                "edgeNGramAnalyzer": {
                    "tokenizer": "edgeTokenizer",
                    "filter": [
                        "word_delimiter",
                        "lowercase",
                        "unique"
                    ]
                }
            },
            "tokenizer": {
                "edgeTokenizer": {
                  "type": "nGram",         <---- change this
                  "min_gram": "3",
                  "max_gram": "8",
                  "token_chars": [
                    "letter",
                    "digit"
                  ]
                }
            }
        }
    }
}
{
“索引”:{
“分析”:{
“分析器”:{
“Edgengramalanalyzer”:{
“标记器”:“边缘标记器”,
“过滤器”:[
“单词分隔符”,
“小写”,
“独一无二”
]
}
},
“标记器”:{
“磨边机”:{

“类型”:“nGram”,非常感谢!它工作正常,您为我节省了数小时的调试时间!