簡體   English   中英

elasticsearch:搜索詞的一部分

[英]elasticsearch: search for parts of words

我正在嘗試學習如何使用elasticsearch(使用elasticsearch-php進行查詢)。 我插入了一些數據,看起來像這樣:

['id' => 1, 'name' => 'butter', 'category' => 'food'], 
['id' => 2,'name' => 'buttercup', 'category' => 'food'],
['id' => 3,'name' => 'something else', 'category' => 'butter'] 

現在,我創建了一個搜索查詢,如下所示:

$query = [
    'filtered' => [
        'query' => [
            'bool' => [
                'should' => [
                    ['match' => [
                        'name' => [
                            'query' => $val,
                            'boost' => 7
                        ]
                    ]],
                    ['match' => [
                        'category' => [
                            'query' => $val,
                            'boost' => 5
                        ]
                    ]],
                ],
            ]
        ]
    ]
];

其中$ val是搜索詞。 這很好用,這是我唯一的問題:當我搜索“黃油”時,我發現編號1和3,而不是2,因為searchterm似乎只匹配確切的單詞。 有沒有一種方法可以搜索“單詞內”,或者用mysql術語執行類似WHERE name LIKE'%val%'的操作?

您可以嘗試使用wildcard查詢

$query = [
    'filtered' => [
        'query' => [
            'bool' => [
                'should' => [
                    ['wildcard' => [
                        'name' => [
                            'query' => '*'.$val.'*',
                            'boost' => 7
                        ]
                    ]],
                    ['wildcard' => [
                        'category' => [
                            'query' => '*'.$val.'*',
                            'boost' => 5
                        ]
                    ]],
                ],
            ]
        ]
    ]
];

query_string查詢。

$query = [
    'filtered' => [
        'query' => [
            'bool' => [
                'should' => [
                    ['query_string' => [
                        'default_field' => 'name',
                        'query' => '*'.$val.'*',
                        'boost' => 7
                    ]],
                    ['query_string' => [
                        'default_field' => 'category',
                        'query' => '*'.$val.'*',
                        'boost' => 7
                    ]],
                ],
            ]
        ]
    ]
];

如果您有大量數據,兩者都可以工作,但效果不佳。

正確的方法是使用帶有標准令牌生成器和ngram令牌過濾器自定義分析器 ,以便將每個令牌切成小塊並將其切成小塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM