- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在搜索表单中有一个文本框,我想将组合框/自动完成小部件附加到该文本框。当用户输入时,我想自动建议相关的地名。所以如果用户输入“Ca”,建议柬埔寨、喀麦隆、加拿大、佛得角等,排名高于北卡罗来纳州和南卡罗来纳州。如果用户键入“Sea”,则返回红海、黑海等项目,但可能不会返回 Chelsea(如果有的话,这应该得分较低)。我们的地名数据库非常精细和复杂,包含大量数据和大量地名的替代名称/翻译。数据存储在 SQL Server 中,我们使用 Entity Framework 作为数据访问层。不用说,使用 LINQ to Entities 有效地查询我们的 Places
实体聚合是缓慢且低效的。
我看的是 Lucene.Net,而不是编写自定义 SQL 和索引来优化数据库搜索。今天是我测试它的第一天。我读过的大多数 Lucene 帮助都使用 StandardAnalyzer
进行索引。我在使用它进行几次测试时遇到了一些麻烦。例如,请考虑以下内容:
var searchTerms = new[] { "Ca", "China", "Sea", };
searchTerms = searchTerms.Concat(searchTerms.Select(x => x.ToLower())).ToArray();
var reader = IndexReader.Open(_directory, true);
foreach (var searchTerm in searchTerms)
{
var searcher = new IndexSearcher(reader);
var query1 = new WildcardQuery(new Term("OfficialName", string.Format("*{0}*", searchTerm)));
var query2 = new TermQuery(new Term("OfficialName", searchTerm));
var query3 = new QueryParser(Version.LUCENE_30, "OfficialName", new SimpleAnalyzer()).Parse(searchTerm);
var query4 = new PrefixQuery(new Term("OfficalName", searchTerm));
var query5 = new BooleanQuery();
query5.Add(query1, Occur.SHOULD);
query5.Add(query2, Occur.SHOULD);
query5.Add(query3, Occur.SHOULD);
query5.Add(query4, Occur.SHOULD);
var queryToRun = query5;
var results = searcher.Search(queryToRun, int.MaxValue);
var hits = results.ScoreDocs;
上面的代码只是尝试了正常和小写版本的术语。有趣的是,“Ca”查询不返回任何结果,但“ca”返回大量结果——非洲、北美等。我想我在某处读到标准分析器根据大小写区分术语,所以这可能就是为什么…… ?其他搜索词会返回人们可能期望的结果。
当使用关键字分析器对相同的数据进行索引时,结果会大不相同。一件奇怪的事情是“china”只返回 1 个结果,“Uchinada-machi”。我原以为它还会返回“中国”和“东海”。此外,“sea”会返回诸如“肯辛顿和切尔西皇家自治市镇”和“斯旺西市和县”之类的结果,但不会返回任何其他预期结果。
那我该怎么办呢?我应该为不同的分析器设置不同的文本索引吗?我是否需要查询带有小写文本的文档字段?我阅读了有关使用 NGram 分词器的信息,但它们似乎不再位于 Lucene.Net.Analysis 命名空间中。
最佳答案
我认为这个问题的答案是“这取决于,但可能不是”。根据Lucene in Action , KeywordAnalyzer
将整个 string
视为单个分析标记。所以它不会把像“东海”这样的东西分解成“东方”、“中国”和“海”来分别搜索。知道了这一点,我得到了我尝试的查询类型的上述结果是有道理的。
我对我对 Lucene 中区分大小写的理解仍然不是完全自信,所以如果我错了请纠正我,但看起来你必须将搜索输入大小写与用于索引的字段和分析器相匹配。我真正掌握这一点的唯一方法是测试分析器、文档字段(普通和小写)和字段设置(ANALYZED
与 NOT_ANALYZED
)的不同组合。上面引用的链接将小写文本的过程称为规范化。
我发现当使用 StandardAnalyzer
分析搜索的字段时,使用大写和小写输入文本的组合(如“Ch”)进行搜索不会返回任何结果。既然我已经阅读了上面的链接,这就更有意义了。看起来 StandardAnalyzer
在创建搜索标记时将规范化为小写。因此,如果您执行类似 new QueryParser(Version.LUCENE_30, field, analyzer).Parse("Ch")
的操作,大多数分析器实际上会将其转换为小写,因为索引中的标记是小写。
对于 OP,似乎一个好的解决方案是规范化(小写)用户输入的查询,这些查询是针对分析器规范化的字段运行的。如果需要,您可以将结果与针对 NOT_ANALYZED
字段(或使用非规范化分析器索引的字段)运行的非规范化用户输入合并(可能为后者提供更高的提升因子)。
关于lucene.net - 最好使用 lucene KeywordAnalyzer 为自动建议文本框索引文本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20710503/
所以这只是一个好奇的问题。 如果我想退回单位,哪个更好? |> ignore 或者 () 应该还有其他方法。考虑到这些,我只想知道什么是最好的: 什么是性能最高的 生产环境的最佳实践是什么 什么是长期
我如何(最好)将方法调用返回的Option转换为Try(通过首选项,尽管Either或scalaz \/甚至是Validation都可以),包括在适当时指定Failure值? 例如,我有以下代码,虽然
我读了第一本关于 C# 的书,但对 LINQ 完全一无所知。请推荐对读者友好的 linq Material 。 谢谢 最佳答案 LINQ in Action已经有好几个人向我推荐了。 关于c# - 从
这个问题已经有答案了: How to create a template in HTML? (3 个回答) 已关闭 7 年前。 我正在寻找一种将一个 html 文件包含在另一个 html 文件中的最佳
我有一个在线注册,可以将数据保存到托管的 mssql 数据库中......基本上我想做的是在本地服务器上运行日常例行程序,就像 Insert into Home.tableA Select * fro
我有文本文件要加载到数据框中。加载后,这些值都在一列中,格式如下: 0 Alabama[edit] 1 Auburn (something somethign) 2 Florence (somethi
例如:我有一个带有外键的“历史”表,它可能根据字段值指向不同的表/实体。 表历史: create table history( id int PimaryKey AUTO_INC, e
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我有业务对象(DEVELOPERS WRITE)和一些 SPROCS(DBA WRITE) 谁能推荐一个好的对象映射器来处理这种设置。 我尝试了 codesmith 和 nhibernate,但遇到了
我应该测试 if 某事是否有效,还是只测试 try 来执行它并捕获异常? 是否有任何可靠的文档表明首选一种方法? 还有一种方式 pythonic? 例如,我应该: if len(my_list) >=
在 Java 中遍历字符串字符的一些方法是: 使用 StringTokenizer? 将 String 转换为 char[] 并对其进行迭代。 最简单/最好/最正确的迭代方式是什么? 最佳答案 我使用
我是一个真正的 Erlang 新手(1 周前开始),我正在尝试通过创建一个小而高效的聊天服务器来学习这种语言。 (当我说高效时,我的意思是我有 5 台服务器用于对数十万连接的客户端进行压力测试 - 一
这个问题已经有答案了: How to access the correct `this` inside a callback (15 个回答) 已关闭 5 年前。 我正在使用 NPM 包 prompt
到目前为止我已经做了一些测试(例如 RPC)接下来我来到多分页部分,到目前为止我读到的内容中有很多选项: MVP、布局、UIbind。 现在我真的不知道该选择哪个,哪个既简单又好。 我尝试清除我的根面
我们正在寻找我们能找到的最好的基于 jQuery 的用户界面库。它不一定是免费的。人们在使用什么? 我们使用过jQueryUI ,但发展似乎已经停滞。很长一段时间以来没有太多新东西。 jQuery T
我是 OpenCL 编程的初学者。我的 PC 装有 Windows 8.1,配备英特尔显卡和 AMD Radeon 7670。当我搜索下载 OpenCL SDK 和示例 helloworld 程序时,
我从人们那里得到的印象是...除非与 process.nextTick 一起使用,否则所有 JavaScript 函数都是同步的。什么时候使用它最好? 我想确保我不会在不需要它的地方过度使用它。在这一
我有一个单词列表,我想对其进行过滤,这样我就只有该单词列表中的名词(使用 Java)。为此,我正在寻找一种简单的方法来查询单词数据库的类型。 我的问题是有没有人知道一个免费、简单的单词查找 API,它
我想开发一个新的 iPhone 应用程序,我之前开发了一个应用程序,但被应用程序商店拒绝了,因为我使用的 StoryBoard 在之前的 iOS 4.3 中不起作用,所以我改用了 XIB。 现在最低版
我正在尝试制作注册表,我只想在其中注册特定域的电子邮件。例如我只想注册来自 companyX、companyY、companyZ 的电子邮件。 因此可接受的电子邮件将是:- myname@compan
我是一名优秀的程序员,十分优秀!