elasticSearch搜索:比如,我有一个关键字是“北京地铁”,但是我只想搜索挨着的关键词,比如搜索【北京】或者搜索【地铁】或者在搜索【北京地铁】这种的可以保证能匹配到,但是如果隔词搜索就不让他显示出来,比如:【北地】,【京铁】,这种隔词了,就不让搜索出来如何处理,不采用match_phrase的方法,还有没有更加高效的方法?
我尝试过使用match_phrase可以做到我要的结果,但是match_phrase效率不是很高;
elasticSearch搜索:比如,我有一个关键字是“北京地铁”,但是我只想搜索挨着的关键词,比如搜索【北京】或者搜索【地铁】或者在搜索【北京地铁】这种的可以保证能匹配到,但是如果隔词搜索就不让他显示出来,比如:【北地】,【京铁】,这种隔词了,就不让搜索出来如何处理,不采用match_phrase的方法,还有没有更加高效的方法?
我尝试过使用match_phrase可以做到我要的结果,但是match_phrase效率不是很高;
要实现高效匹配邻近关键字,除了使用match_phrase
查询外,还可以考虑以下几种方法:
bool
查询结合match
和range
查询:* 对于连续的关键字,你可以使用`bool`查询结合`match`和`range`查询。例如,要搜索“北京地铁”,你可以使用以下查询:
```
json`{
"query": {
"bool": {
"must": [
{ "match": { "field": "北京" } },
{ "match": { "field": "地铁" } }
]
}
}
}`
```
* 这种方法适用于关键字之间没有其他文本的情况。如果关键字之间有文本,可以使用`range`查询来确保关键字的距离。例如:
```
json`{
"query": {
"bool": {
"must": [
{ "match": { "field": "北京" } },
{ "range": { "keyword_distance": { "gte": 1 } } },
{ "match": { "field": "地铁" } }
]
}
}
}`
```
script
查询:* Elasticsearch允许使用脚本来进行更复杂的查询。你可以编写一个脚本来检查关键字之间的距离。例如,以下脚本可以用于检查“北京”和“地铁”之间的距离:
```
bash`boolQuery=true;
for (int i = 0; i < terms.length - 1; i++) {
if (terms[i].equals("北京") && terms[i+1].equals("地铁")) {
boolQuery=false; // if '北京' and '地铁' are consecutive, set boolQuery to false
break;
}
}
return boolQuery;`
```
prefix
查询:* 对于连续的关键字,你还可以使用`prefix`查询来提高效率。例如,要搜索“北京地铁”,你可以使用以下查询:
```
json`{
"query": {
"bool": {
"must": [
{ "prefix": { "field": "北京" } },
{ "prefix": { "field": "地铁" } }
]
}
}
}`
```
* 确保你的索引已经优化,包括使用合适的分析器、停用词、大小写敏感度等设置。优化索引可以提高查询性能。