SolrNet客户端可以在与solr服务器不同的机器上运行吗?

时间:2013-01-17 12:03:20

标签: solrnet

我在机器192.168.0.113(Centos 5.5)中设置了在Tomcat中运行的solr服务器。 我在matchine 192.168.0.114(Windows server 2003)中部署了一个网站。 我在matchine 192.168.0.114中使用solrnet。 完整的代码如bellow(由@Paige Cook编辑):

using System;
using System.Collections.Generic;
using System.Text;
using SolrNet;
using NUnit.Framework;
using SolrNet.Attributes;
using SolrNet.Commands.Parameters;
using Microsoft.Practices.ServiceLocation;
namespace MySolrNet
{
    public class Video
    {
        private string videoid;
        [SolrField("videoid")]
        public string Videoid
        {
            get { return videoid; }
            set { videoid = value; }
        }

        private string videoname;
        [SolrField("videoname")]
        public string Videoname
        {
            get { return videoname; }
            set { videoname = value; }
        }
        private string videoorigin;
        [SolrField("videoorigin")]
        public string Videoorigin
        {
            get { return videoorigin; }
            set { videoorigin = value; }
        }
        public Video(string id, string name, string origin)
        {
            this.Videoid = id;
            this.Videoname = name;
            this.Videoorigin = origin;
        }
        public Video()
        {

        }
        public void FixtureSetup()
        {
            Startup.Init<Video>("http://192.168.0.113:8070/solr");
        }
        public void Add()
        {
            Video p = new Video("1", "test video", "Solr Test");
            ISolrOperations<Video> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Video>>();
            solr.Add(p);
            solr.Commit();
        }
    }

    [TestFixture]
    public class VideoTests
    {
        [TestFixtureSetUp]
        public void FixtureSetup()
        {
            Startup.Init<Video>("http://192.168.0.113:8070/solr");
        }
        [Test]
        public void Add()
        {
            Video p = new Video("1", "test video", "Solr Test");
            ISolrOperations<Video> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Video>>();
            solr.Add(p);
            solr.Commit();
        }
        [Test]
        public void Query()
        {
            ISolrOperations<Video> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Video>>();
            SolrQueryResults<Video> results = solr.Query(new SolrQueryByField("videoid", "33013"));
            Assert.AreEqual(1, results.Count);
            Console.WriteLine(results[0].Videoname);
        }
    }
}

但是,添加查询测试都会失败。 它抱怨: TestFixture失败:SetUp:System.IO.FileLoadException:无法加载文件或程序集“SolrNet,Version = 0.4.0.2002,Culture = neutral,PublicKeyToken = bc21753e8aa334cb”或其中一个依赖项。

但我在我的projoect中添加了对Microsoft.Practices.ServiceLocation.dll和SolrNet.dll的引用,是否还有其他任何我想念的dll文件?

顺便说一句,我可以使用以下网址访问浏览器中的solr服务器:http://192.168.0.113:8070 / solr。

任何人都可以告诉我:

  1. 我可以在不同的机器上运行solrnet和solr吗?
  2. 怎么做。
  3. 非常感谢!

3 个答案:

答案 0 :(得分:3)

我不明白你为什么在使用Init Solr时使用两个不同的URL。尝试将Paige应用程序中的URL更改为您在原始问题中发布的URL:

http://192.168.0.113:8070/solr

答案 1 :(得分:1)

感谢发布代码。我看到的第一件事是你使用测试类作为类类型将数据传递给Solr。将这些分开,这可能会导致一些问题。我建议如下:

public class Video
{
    private string videoid;
    [SolrField("videoid")]
    public string Videoid
    {
        get { return videoid; }
        set { videoid = value; }
    }

    private string videoname;
    [SolrField("videoname")]
    public string Videoname
    {
        get { return videoname; }
        set { videoname = value; }
    }
    private string videoorigin;
    [SolrField("videoorigin")]
    public string Videoorigin
    {
        get { return videoorigin; }
        set { videoorigin = value; }
    }
}

[TestFixture]
public class VideoTests
{
    [TestFixtureSetUp]
    public void FixtureSetup()
    {
        Startup.Init<Video>("http://192.168.0.113/solr");
    }
  [Test]
    public void Add() {
        Video p = new Video("1","test video","Solr Test");
        ISolrOperations<Video> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Video>>();
        solr.Add(p);
        solr.Commit();
    }
    [Test]
    public void Query()
    {
        ISolrOperations<Video> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Video>>();
        SolrQueryResults<Video> results = solr.Query(new SolrQueryByField("videoid", "33013"));
        Assert.AreEqual(1, results.Count);
        Console.WriteLine(results[0].Videoname);
    }        
}

更新: 在控制台应用程序中尝试这个,看看它是否有效......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SolrNet;
using Microsoft.Practices.ServiceLocation;
namespace Test1
{
    class Program
    {
        static void Main(string[] args)
        {
            Startup.Init<Video>("http://192.168.0.113:8070/solr");
            var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Video>>();

            var video = new Video("1", "test", "test");
            solr.Add(video);
            solr.Commit();

            var results = solr.Query(SolrQuery.All);
            Console.WriteLine("{0} - {1} - {2}",
                results[0].Videoid, results[0].Videoname, results[0].Videoorigin);
        }
    }
    public class Video
    {
        public Video(string id, string name, string origin)
        {
            Videoid = id;
            Videoname = name;
            Videoorigin = origin;
        }

        public string Videoid { get; set; 
        public string Videoname { get; set; }
       public string Videoorigin { get; set; }
    }
}

答案 2 :(得分:0)

您可以按照Paige的建议检查您的项目设置吗? 您是否在解决方案中添加了SolrNet源代码作为项目参考? 如果您使用的是dll,可以粘贴.csproj文件内容吗?如果紧急,请下载源代码并在解决方案中添加为项目参考,直到找出问题为止。