我对ElasticSearch相当新,并对停用词有疑问。我有一个索引,其中包含美国的州名....例如:纽约/纽约,加利福尼亚/加利福尼亚州,俄勒冈州/或。我相信Oregon的缩写'OR'是一个停用词,所以当我将状态数据插入索引时,我无法搜索'OR'。有没有办法可以为此设置自定义停用词,或者我做错了什么?
以下是我构建索引的方法:
curl -XPUT http://localhost:9200/test/state/1 -d '{"stateName": ["California","CA"]}'
curl -XPUT http://localhost:9200/test/state/2 -d '{"stateName": ["New York","NY"]}'
curl -XPUT http://localhost:9200/test/state/3 -d '{"stateName": ["Oregon","OR"]}'
搜索“NY”,工作正常。例如:
curl -XGET 'http://localhost:9200/test/state/_search?pretty=1' -d '
{
"query" : {
"match" : {
"stateName" : "NY"
}
}
}'
但是搜索“OR”会返回零点击:
curl -XGET 'http://localhost:9200/test/state/_search?pretty=1' -d '
{
"query" : {
"match" : {
"stateName" : "OR"
}
}
}'
我相信这个搜索没有返回结果,因为OR是停用词,但我不知道如何解决这个问题。谢谢你的帮助。
答案 0 :(得分:4)
您可以(并且绝对应该)根据您的数据以及您想要搜索的方式修改mapping来控制数据编制方式。
在你的情况下,我会禁用该特定字段的停用词,而不是修改禁用词列表,但如果你愿意,也可以执行后者。关键是你正在使用默认的映射,这是很好的开始,但正如你所看到的,你需要根据你的需要进行调整。
对于每个字段,您可以指定要使用的分析器。分析器定义了将文本拆分为将被索引的标记(标记化器)的方式,以及使用标记过滤器对每个标记进行的其他更改(甚至删除或添加新标记)。
您可以在creating your index之前指定地图,也可以使用put mapping api更新地图(只要您所做的更改向后兼容)。