写这篇随笔主要是提出问题,问题我没有能力解决

关心dotnetnuek的很多朋友,都在关注着她
但是在不断的为dnn3的一步步成长感到欣慰的同时,也发现目前其距离我们中文用户的需求还相距很远。
很显著,也是最然人头疼得问题是:中文搜索,
一直以来使用中文关键字搜索都没有结果,或者仅有很少的结果
我开始发现了这个问题,但是并没有太关心,直到现在3.0.12出来,问题依然存在,因为3.0.12已经不是bata了,随后的3.0.13马上就会推出,官方根本就没有考虑中文搜索的问题

那么,为什么英文搜索可以中文搜索就不可以呢?
仔细看一下就发现的dotnetnuke搜索功能是使用SearchProviders来进行的,而SearchDataStore择为搜索提供关键词方面的功能,那么问题一定出在这里

作为测试,我首先在自己的dnn站点里添加了一些中文的内容,然后使用host下的搜索管理重建索引,重新打开SearchWord表,发现已经有中文内容添加了进来,但是作为关键词/可搜索内容的word却不是我们需要的,比如“中文搜索如何处理”“增加内容”“中文搜索听说有问题”“测试一下”,这些都是我为了测试输入的中文语句,而与此同时输入的英文内容却很正常,"chinese" "test" ,输入引号中的内容可以得出搜索结果,这样可以基本判断,问题出现在产生关键词的步骤,而向SearchWord表中添加内容的存储过程是AddSearchWord,那么是谁调用了AddSearchWord?最终错误定位在

SearchDataStore.vb的117行

  L116~L134

关于dotnetnuke中文搜索问题的分析+临时方法           ' split content into words
 
               Dim ContentWords() As String = Split(Content, " ")
关于dotnetnuke中文搜索问题的分析+临时方法
关于dotnetnuke中文搜索问题的分析+临时方法            
' process each word
关于dotnetnuke中文搜索问题的分析+临时方法
            Dim intWord As Integer
关于dotnetnuke中文搜索问题的分析+临时方法            
Dim strWord As String
关于dotnetnuke中文搜索问题的分析+临时方法            
For Each strWord In ContentWords
关于dotnetnuke中文搜索问题的分析+临时方法                
If CanIndexWord(strWord, Language) Then
关于dotnetnuke中文搜索问题的分析+临时方法                    intWord 
= intWord + 1
关于dotnetnuke中文搜索问题的分析+临时方法                    
If IndexWords.ContainsKey(strWord) = False Then
关于dotnetnuke中文搜索问题的分析+临时方法                        IndexWords.Add(strWord, 
0)
关于dotnetnuke中文搜索问题的分析+临时方法                        IndexPositions.Add(strWord, 
1)
关于dotnetnuke中文搜索问题的分析+临时方法                    
End If
关于dotnetnuke中文搜索问题的分析+临时方法                    
' track number of occurrences of word in content
关于dotnetnuke中文搜索问题的分析+临时方法
                    IndexWords(strWord) = CType(IndexWords(strWord), Integer+ 1
关于dotnetnuke中文搜索问题的分析+临时方法                    
' track positions of word in content
关于dotnetnuke中文搜索问题的分析+临时方法
                    IndexPositions(strWord) = CType(IndexPositions(strWord), String& "," & intWord.ToString
关于dotnetnuke中文搜索问题的分析+临时方法                
End If
关于dotnetnuke中文搜索问题的分析+临时方法            
Next
关于dotnetnuke中文搜索问题的分析+临时方法
看到这里也就明白了,老外通过空格就可以将内容很容易的分割开,然后进行搜索当然没问题,可是中文就不能使用空格分隔,所以连在一起的一句话,就成了一个“关键词”了。

要想解决这个问题,可能的思路是
1、进行中文的分词,对中文或者中英文混合的内容进行索引
2、开发新的SearchProvider

以上均是浅见,不确切、不正确的地方,还请大家指教

按宝玉的指教,使用临时方法,用like查询
输入中文关键字的时候使用 %中文% 
另外在host->SQL中执行如下代码

关于dotnetnuke中文搜索问题的分析+临时方法ALTER  procedure dbo.GetSearchResults
关于dotnetnuke中文搜索问题的分析+临时方法    @PortalID 
int,
关于dotnetnuke中文搜索问题的分析+临时方法    @Word 
nVarChar(100)
关于dotnetnuke中文搜索问题的分析+临时方法
AS
关于dotnetnuke中文搜索问题的分析+临时方法
SELECT si.SearchItemID,
关于dotnetnuke中文搜索问题的分析+临时方法    sw.Word,
关于dotnetnuke中文搜索问题的分析+临时方法    siw.Occurrences,
关于dotnetnuke中文搜索问题的分析+临时方法    siw.Occurrences 
+ 1000 as Relevance,
关于dotnetnuke中文搜索问题的分析+临时方法    m.ModuleID,
关于dotnetnuke中文搜索问题的分析+临时方法    tm.TabID,
关于dotnetnuke中文搜索问题的分析+临时方法    si.Title,
关于dotnetnuke中文搜索问题的分析+临时方法    si.Description,
关于dotnetnuke中文搜索问题的分析+临时方法    si.Author,
关于dotnetnuke中文搜索问题的分析+临时方法    si.PubDate,
关于dotnetnuke中文搜索问题的分析+临时方法    si.SearchKey,
关于dotnetnuke中文搜索问题的分析+临时方法    si.Guid,
关于dotnetnuke中文搜索问题的分析+临时方法    si.ImageFileId,
关于dotnetnuke中文搜索问题的分析+临时方法    u.FirstName 
+ ' ' + u.LastName As AuthorName
关于dotnetnuke中文搜索问题的分析+临时方法
FROM SearchWord sw
关于dotnetnuke中文搜索问题的分析+临时方法    
INNER JOIN SearchItemWord siw ON sw.SearchWordsID = siw.SearchWordsID
关于dotnetnuke中文搜索问题的分析+临时方法    
INNER JOIN SearchItem si ON siw.SearchItemID = si.SearchItemID
关于dotnetnuke中文搜索问题的分析+临时方法    
INNER JOIN Modules m ON si.ModuleId = m.ModuleID
关于dotnetnuke中文搜索问题的分析+临时方法    
LEFT OUTER JOIN TabModules tm ON si.ModuleId = tm.ModuleID
关于dotnetnuke中文搜索问题的分析+临时方法    
INNER JOIN Tabs t ON tm.TabID = t.TabID
关于dotnetnuke中文搜索问题的分析+临时方法    
LEFT OUTER JOIN Users u ON si.Author = u.UserID
关于dotnetnuke中文搜索问题的分析+临时方法
WHERE 
关于dotnetnuke中文搜索问题的分析+临时方法    (((m.StartDate 
Is NullOR (GetDate() > m.StartDate)) AND ((m.EndDate Is NullOR (GetDate() < m.EndDate)))
关于dotnetnuke中文搜索问题的分析+临时方法    
AND (((t.StartDate Is NullOR (GetDate() > t.StartDate)) AND ((t.EndDate Is NullOR (GetDate() < t.EndDate)))
关于dotnetnuke中文搜索问题的分析+临时方法    
AND (sw.Word like @Word) 
关于dotnetnuke中文搜索问题的分析+临时方法    
AND (t.IsDeleted = 0
关于dotnetnuke中文搜索问题的分析+临时方法    
AND (m.IsDeleted = 0
关于dotnetnuke中文搜索问题的分析+临时方法    
AND (t.PortalID = @PortalID)
关于dotnetnuke中文搜索问题的分析+临时方法

相关文章:

  • 2021-09-05
  • 2022-12-23
  • 2021-06-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-14
  • 2021-06-28
猜你喜欢
  • 2022-01-17
  • 2021-05-18
  • 2021-05-27
  • 2022-02-14
  • 2021-05-21
  • 2021-09-14
  • 2022-03-01
相关资源
相似解决方案