lucenenet-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Robert Boulanger <rob...@boulanger.at>
Subject Remote searches with Lucene
Date Sat, 19 Aug 2006 17:27:16 GMT
Hi Elena, hi Rest,

> Dear All,
>
> The application I am working on is intended to make use of the 
> distributed search capabilities of the Lucene library. While trying to 
> work with the Lucene’s RemoteSearchable class, I faced some problems 
> cased by the current Lucene implementation. In following I’ll try to 
> describe them, as well as the possible ways of their solution, I 
> identified. The most important question for me is, if these changes 
> have a chance to be integrated in the coming Lucene versions, such 
> that remote searches would really become feasible. I would appreciate 
> any feedback.

Same problem for me and I found some more issues which I explain below:

>
> The first problem concerns the construction of the RemoteSearchable 
> object. .Net framework allows for both, server and client activation 
> models of the remote objects. Currently, RemoteSearchable class 
> possesses only one constructor that requires knowledge of a local 
> Searchable object:
>
> public RemoteSearchable(Lucene.Net.Search.Searchable local)
>
I just added a new constructor to RemoteSearchable
public RemoteSearchable(): base()
{
this.local = this.local;
}

not the fine method but for me it works so far.

> Since this “local” object is located on the server, knowledge of the 
> server’s index paths is needed for its creation. However, there are at 
> least some scenarios where only the server, but not the client, knows 
> where the indexes are stored on the server side. I think this problem 
> could be solved by extending RemoteSearchable class with a standard 
> constructor that reads the names of the indexes to be published out of 
> a configuration file on the server side.
>
My "Server" now implements a Class which inherits directly from Remote 
Searchable.
in the parameterless constructor there I read the server sided 
configfile which contains the index location , create a new IndexReader 
and pass it as Argument to MyBase.New()
See sample below.

> 2. Bug in Term construction
[snip]

This whole chapter was very useful and I can commit everything works 
fine from there on.

But there is still a bug in FieldDocSortedHitQueue line 130 and below:
I figured out that the castings are not working when the system is 
running in a non english globalization context.
The String in docAFields[i] which might be for example 1.345678 is 
casted to 1345678.0 since the decimal sign is misinterpreted in German 
systems as it seems.
So the casting results in an overflow.

So I changed it as follows:

case SortField.SCORE:
float r1 = (float)Convert.ToSingle(docA.fields[i], 
System.Globalization.NumberFormatInfo.InvariantInfo);
float r2 = (float)Convert.ToSingle(docA.fields[i], 
System.Globalization.NumberFormatInfo.InvariantInfo);
if (r1 > r2)
c = - 1;
if (r1 < r2)
c = 1;
break;

Same in line 172 and 174:

float f1 = (float)Convert.ToSingle(docA.fields[i], 
System.Globalization.NumberFormatInfo.InvariantInfo);
//UPGRADE_TODO: The equivalent in .NET for method 
'java.lang.Float.floatValue' may return a different value. 
"ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1043'"
float f2 = (float)Convert.ToSingle(docB.fields[i], 
System.Globalization.NumberFormatInfo.InvariantInfo);



A tiny Client Server Solution now looks like this (Here in VB.NET)
SERVER:
Public Class RemoteQuery
Inherits RemoteSearchable
Public Sub New()
MyBase.New(New IndexSearcher("C:\lucene\index"))
End Sub
Public Sub New(ByVal local As Searchable)
MyBase.New(local)
End Sub

End Class

Module Module1
Public Sub Main(ByVal args As System.String())
Dim chnl As New HttpChannel(8888)
ChannelServices.RegisterChannel(chnl, False)
Dim indexName As System.String = Nothing
RemotingConfiguration.RegisterWellKnownServiceType(GetType(RemoteQuery), 
"Searchable", WellKnownObjectMode.Singleton)
System.Console.ReadLine()
End Sub
End Module
CLIENT
Sub Main()
Dim searchables As Lucene.Net.Search.Searchable() = New 
Lucene.Net.Search.Searchable() {LookupRemote()}
Dim searcher As Searcher = New MultiSearcher(searchables)
Dim sort As New Lucene.Net.Search.Sort
sort.SetSort(Lucene.Net.Search.SortField.FIELD_SCORE)
Dim query As Query = QueryParser.Parse("Harry", "body", New 
StandardAnalyzer())
Dim result As Hits = searcher.Search(query, sort)
End Sub
Private Function LookupRemote() As Lucene.Net.Search.Searchable
Return CType(Activator.GetObject(GetType(Lucene.Net.Search.Searchable), 
"http://192.168.8.7:8888/Searchable"), Lucene.Net.Search.Searchable)
End Function

Hope this helps you and anybody else how has problems with remotesearch 
so far.

BTW: this all refers Version 1.9rc1

--Robert Boulanger

Mime
View raw message